From patchwork Fri Apr 11 09:00:25 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: 880682 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 CF94C28FFD8; Fri, 11 Apr 2025 09:01:47 +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=1744362111; cv=none; b=rtv69g5nM+FqEGCHqPHC9kE2R7D4CvhvXdGr+wmmSn18AQWCLhJTNHcW4rnzA1GNaP3zjbWgp6rHi5MPn6hDP5smi4c6zJA4h97/itbwZpE+VksaSc5SEX9DAx8RJBfluJ0xSGHeugUqQ4OkjxlAZEP8YG5TN0R8xrJkD+yfA5Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362111; c=relaxed/simple; bh=CkReCjorx7vJhS2pvgkt1IbcBluzvxPxy7odnUgPOyo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=H87ztNswFLVoV5Hq/Pq8r32aaIDQd7l1AgdUnc0QOzi6zyN98XM4LEGqrwbZtcZBOUZozsrQALExM9coDbXfc/jooxO21JR7L7pEUI0LqKcXdpVPKR5qIch6LPco/22d9WIwWSLyyPU1i9Of9soblRzLGudEBBSF9votAXTNrWw= 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=a/fTRq8c; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=BGm6WFo3; 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="a/fTRq8c"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="BGm6WFo3" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362105; 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=RboCJjwJSKbAAHccSZdmQVgKsM9gi3RLUt41m4jx2jA=; b=a/fTRq8cDMDBnzJjxFoejZzdq8cpGEGCzRx6m0RpxXha9IVZbsFLrjZpw3CDzWCtK3a5FS l6ErjXC4YpFuLt2QJ8KuDyzDMAnVfa5J6CpZTmATbRMq1850CB7bC/gqFKmS1k9QIsZJH7 F2/QoO+EAfIbf/htQ6UR9nYU3UYYr2uOZsUAlbMbSluW5DMlqSj25A2faZZRUwIsvR4Xwn Hqk0vIrPWp+r+kpLGaXxzJ+JjqDja+EnkkEt0cIiPOcCcCF7VY2D2D11kPWYFYtPI+IJbr xX9gXsIy40b2SlvzvMya7hejN+sbHc2B55OXN3LSDZovj5cRZ2KOM+7do/DBcg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362105; 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=RboCJjwJSKbAAHccSZdmQVgKsM9gi3RLUt41m4jx2jA=; b=BGm6WFo3OhQr6Lw2L6f2fUGsJhcZ/Lg1iuhZBk7pRH3R9oWxmw/OUV++czEUzGV3GG3t0A zyfjoJuOMegQJUCA== Date: Fri, 11 Apr 2025 11:00:25 +0200 Subject: [PATCH v3 01/32] selftests: harness: Add kselftest harness selftest Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250411-nolibc-kselftest-harness-v3-1-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=8793; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=CkReCjorx7vJhS2pvgkt1IbcBluzvxPxy7odnUgPOyo=; b=h1cG9FfeOn4xlf9NomzJO+rL1hbf9lA6Sand0740JkMzypCVXWAzFuErUN8k2T6NxAt04mGU2 79V/U8CsrU8Bgvx223Sd7WbsbYUplHKJNvobwPzijluuFEbN3meSMuY X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Add a selftest for the kselftest harness itself so any changes can be validated. Signed-off-by: Thomas Weißschuh --- MAINTAINERS | 1 + tools/testing/selftests/Makefile | 1 + .../testing/selftests/kselftest_harness/.gitignore | 2 + tools/testing/selftests/kselftest_harness/Makefile | 7 ++ .../selftests/kselftest_harness/harness-selftest.c | 129 +++++++++++++++++++++ .../kselftest_harness/harness-selftest.expected | 62 ++++++++++ .../kselftest_harness/harness-selftest.sh | 13 +++ 7 files changed, 215 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 96b82704950184bd71623ff41fc4df31e4c7fe87..9d5278df33c8b63b3b08155991b789b3a998f80e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -21742,6 +21742,7 @@ F: include/linux/seccomp.h F: include/uapi/linux/seccomp.h F: kernel/seccomp.c F: tools/testing/selftests/kselftest_harness.h +F: tools/testing/selftests/kselftest_harness/ F: tools/testing/selftests/seccomp/* K: \bsecure_computing K: \bTIF_SECCOMP\b diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile index c77c8c8e3d9bdd8047c9cb7722c3830447e504e5..27592909a5969da009d71be6c8330fe6779e7354 100644 --- a/tools/testing/selftests/Makefile +++ b/tools/testing/selftests/Makefile @@ -48,6 +48,7 @@ TARGETS += ipc TARGETS += ir TARGETS += kcmp TARGETS += kexec +TARGETS += kselftest_harness TARGETS += kvm TARGETS += landlock TARGETS += lib diff --git a/tools/testing/selftests/kselftest_harness/.gitignore b/tools/testing/selftests/kselftest_harness/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e4e476a333c912602161448bc61787732a6fa2e2 --- /dev/null +++ b/tools/testing/selftests/kselftest_harness/.gitignore @@ -0,0 +1,2 @@ +/harness-selftest +/harness-selftest.seen diff --git a/tools/testing/selftests/kselftest_harness/Makefile b/tools/testing/selftests/kselftest_harness/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..0617535a6ce424ff977e033b0a3a01c3117aefcf --- /dev/null +++ b/tools/testing/selftests/kselftest_harness/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 + +TEST_GEN_PROGS_EXTENDED := harness-selftest +TEST_PROGS := harness-selftest.sh +EXTRA_CLEAN := harness-selftest.seen + +include ../lib.mk diff --git a/tools/testing/selftests/kselftest_harness/harness-selftest.c b/tools/testing/selftests/kselftest_harness/harness-selftest.c new file mode 100644 index 0000000000000000000000000000000000000000..8d39e7a0b99c41a5d33edfe2dbf875cac04c098d --- /dev/null +++ b/tools/testing/selftests/kselftest_harness/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/harness-selftest.expected b/tools/testing/selftests/kselftest_harness/harness-selftest.expected new file mode 100644 index 0000000000000000000000000000000000000000..1aa6461db90d4e7cc0679f19b69aadf4032875ec --- /dev/null +++ b/tools/testing/selftests/kselftest_harness/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/harness-selftest.sh b/tools/testing/selftests/kselftest_harness/harness-selftest.sh new file mode 100755 index 0000000000000000000000000000000000000000..fe72d16370fe5bc16706289ff4e1ff44db180017 --- /dev/null +++ b/tools/testing/selftests/kselftest_harness/harness-selftest.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# +# Selftest for kselftest_harness.h +# + +set -e + +DIR="$(dirname $(readlink -f "$0"))" + +"$DIR"/harness-selftest > harness-selftest.seen || true + +diff -u "$DIR"/harness-selftest.expected harness-selftest.seen From patchwork Fri Apr 11 09:00:26 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: 880684 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 AC0B2293478; Fri, 11 Apr 2025 09:01:48 +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=1744362110; cv=none; b=EPigVoNhXqMK8xYQL+GIHix3CrnnTyqg3eRkQEwSHmLBFz2QbeMfwDMJKzrb8BFnbbqytL89rEN+YK+F6Vbrm4rbN68W1gfMZzSqwci3raM1xTKuAtWsmpEqWhv5O9b01OzIaJP616NxALPa5dTOIQG3SFuk+CC34NoNcZe3VhY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362110; c=relaxed/simple; bh=jGKlKoofOPJIAZx1RxcX4p7LfMYOyHoN+Nx2/9d9seQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P3a6IEAeRByEk43SLjrk7w3QtDpoXN1FKJat4k9L5c0StuB3XyOUXWUXG3Tim8N6c794kRq1N85vtd7Oc9D3PH0awYw/nUkj/3WyDF91K027CcYM7PacOjYTxNKhiCT+H4wYv/5Pxx/4DfkMPiYN7xof//i+6suR0zS20e9pcXM= 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=KdgZ6DD8; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=FrUc3rHd; 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="KdgZ6DD8"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="FrUc3rHd" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362106; 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=wLj0ETsEs/I2mut8MoZZYVz5W4X+4bN5Q7Nlryt1VEQ=; b=KdgZ6DD8bCWkBMBa/MtVkzTx/Qy53mrG7UGCY4MGLQSqpaEJi/CaWe/tw2rYTFcHi7Xe1P OMFtlI3PiuZTiI/l1BK4yvwOVMVxA+ARzh0PsVNbc0elSzwh/waHVk5L/Ry+RbOEbx/lyC ila9497X9Ahh+8dsUJ354gb4V8M89iH5Lzzy2iT3qkUn+ajXu11hT5d814AnRZWDdmJ/uB y08MN2rkQ9HT+X/Yu/bbnuNO3ReMP1MCMgd35m0qDUM8WwkY8LwBqznlsXtGv6ExaRyzKT GuYUl7NiCTnHm1bW/GY6sqQEI8tW1s6o2Ksw02Km4/voA9kMYvDQrIuSocemwQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362106; 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=wLj0ETsEs/I2mut8MoZZYVz5W4X+4bN5Q7Nlryt1VEQ=; b=FrUc3rHdPs5SpaBvgWpYgyMphDwQs6SfV6DetCpt5CtfnpaR2efoAQef8Awoy9oBXHDIaB jdNJu7Wr8u74s+BQ== Date: Fri, 11 Apr 2025 11:00:26 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-2-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=842; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=jGKlKoofOPJIAZx1RxcX4p7LfMYOyHoN+Nx2/9d9seQ=; b=JA0b04Xx84JihNi3xbQ2Xf/AUiNA1hy1Fb9zwOX/yqj/PNAT3GSJZ20xs5Q8N1LQZYDGRJXgT Z/KjAcI2iugBrMvDPuz6XtavKwa59su6Yk8p1jsgiBQn3me20fD9kek 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 Fri Apr 11 09:00:27 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: 880417 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 00B1C293B61; Fri, 11 Apr 2025 09:01:48 +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=1744362110; cv=none; b=j8DA5+VJEDKsprTNppsVeYqdgXIGrGO8P9XmzhUGqSalz5L/o//HQdiqsXn1/nKKvLij/1gum9S1pN6tnnMQYSNtuW5uj8hKGTwjpYE3KOcyCRu5rRkZZUaVhok1LgqO8gLWMjuuP2ahXMJjViCU5wfzzhmFxyXpa23+/rDaZew= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362110; c=relaxed/simple; bh=3GiQDyFtPKhj9wJBDSnpRmP0HUHTpaKTigerUWM/y/E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VsOLNQIx/SnWyXGGumJG5hDMasW++7dhavrQ40dyShtAs4jAtBqkIkNFE5SsPO0vsdeEND7pUW65hUGUqAK23NQBchzptXFABQ7Pk85U3DqeFz5ZUzQR7lKB3tYaKP0i6/4h0Mms9lW5yBkWQb0xmtIO/HwLXeCrOKF+DzuzLko= 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=hNWdPRT6; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=ELMbWFGS; 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="hNWdPRT6"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="ELMbWFGS" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362107; 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=4cJJZUGfA/1w4r3/xI5UpOuuZxDVW61LV8w361vK0Hc=; b=hNWdPRT6eeXVWWaxv8u+MOQMt6TwyzstaLAik9FtmdGE+irmrVqL2Oc0caSeoz7RmT+sm1 BARLmaSkLWXl29X19rtz3qF2oR6THlRHuMd+TVxqj849jpHtpuqOghBi6Y6EZ/2uJ5rWIj kHgS2eSqUExN9L2bkIPUlHNOekd3IvxTGvhthSkCULy9GAXJxuwOC114KTM6g3jVe8jUaO WJgy5JVHbYS22gjFrS5h6+nBWJ3NP9GZDxI0QBtrxY1NrExuXDP1xHoKcLj9ijwIlc07rc cOScjv/GJ+mmbqfqIpiTJ7dsff5jZxxawjmp+SPJnRx4t8mU34XrEz0RdhFXew== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362107; 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=4cJJZUGfA/1w4r3/xI5UpOuuZxDVW61LV8w361vK0Hc=; b=ELMbWFGSb+8PTGHSPrCBA4WbdColNHWp9BVsoNEpeNUNP4GFqsi8IvI2ZnkspHfOdfB4GS 0zq2CqK7481YfFBw== Date: Fri, 11 Apr 2025 11:00:27 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-3-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1638; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=3GiQDyFtPKhj9wJBDSnpRmP0HUHTpaKTigerUWM/y/E=; b=5kVOZQzLLdgll0XcJ8nFCm09x00GzftfJDIecfLAEXe80QW3WYes9lpTa3BiW9g92KX5HUC/q 1xa1R1/7s1MAfI6SapsFh3tK0/R89X3d+MR0XND3HiSM4/VoFeiWYz6 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. Example warning: harness-selftest.c: In function 'wrapper_standalone_pass': ../kselftest_harness.h:181:52: error: unused parameter 'variant' [-Werror=unused-parameter] 181 | struct __fixture_variant_metadata *variant) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~ ../kselftest_harness.h:156:25: note: in expansion of macro '__TEST_IMPL' 156 | #define TEST(test_name) __TEST_IMPL(test_name, -1) | ^~~~~~~~~~~ harness-selftest.c:15:1: note: in expansion of macro 'TEST' 15 | TEST(standalone_pass) { | ^~~~ 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 Fri Apr 11 09:00:28 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: 880416 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 6EE512980A7; Fri, 11 Apr 2025 09:01:49 +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=1744362111; cv=none; b=IMihDIidJULoBcxAwfBzA8jC12BDtyNoHv7JUyrnYTdlNmu0I8cExAi1IttUrecMGtHVMQtUJcZex3D0eAVQL9shnm+qVQ/HzXSlM52JXe0XfuVk8HM8fY4s2E+Uw2hhA8v/gpzqtXbOT9FZY0G/r4YUJ7/uyl/USqHorrBrsuI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362111; c=relaxed/simple; bh=7893zOP3ErdGxPwks26zDP9HHy3HGwCgpTrK5rmbvbc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RpmBMt2Bd7NjX+qTgfm8Cgv3eBgNI0Dq6bT62MPwpmOGcoLkDts6EEk778isxca4u2NAwkrvC2a/Ge133qMdtOb13hFqECWcGxQG7Pju58XcvuAifxCc76XTrLKWQJdOqfACFN2QcMMVMh1ix0G0W+n55wxvkzwBMfE+wwf8CcI= 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=cAO7VPLq; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=R2EDTjpo; 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="cAO7VPLq"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="R2EDTjpo" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362107; 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=Nz0u8GJ5dhijczEOeytq6qafYlrK5qIQk1St+S1OOGs=; b=cAO7VPLqVOUtAzzhZct7m6AJdanZpJAhz73SUmqeuJkT3UiQj+fnJ8vaPG256MG2eHEGnP Yx/lI4nKwu5Bo5NBZHIBldl2UE3uLra5kBnvvbyxtqe2YD1d0piqHfHB+MyFgSksVgUEF0 w8+jwqlt5Y+uqkzJpOBFvrNfBex0/2vCsVO/6ZbvtHYisjBSDHDj/ONdxq6MPVeSriEeuB 6hPNyO/AZQ0a/QjJ5vg3QZ6ZdCI+8v0HldNTJZC0ayNry61m0q7+AhLq4bsh13zGk8gfnB K+5UBXLaNXNST1D6uZnZC64fdCaNWDTZFwKCtvlDYY6GE1StzpPfUtIap/thNA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362107; 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=Nz0u8GJ5dhijczEOeytq6qafYlrK5qIQk1St+S1OOGs=; b=R2EDTjpoYByqeaoQkC+cVRaM3IyXf2XlXZyjjwUaG2maUzNA8zHr+z0kOjD6V+ctGwhsag 6ti6lYHAeeXQ95CA== Date: Fri, 11 Apr 2025 11:00:28 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-4-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=2245; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=7893zOP3ErdGxPwks26zDP9HHy3HGwCgpTrK5rmbvbc=; b=kwuHGbOCvhwkjq6R92NXRbTu5KQYILLerD3h2waEjKBfh7d8rLMtW0GPW+bpTE8VnwE8aN1HD w9OPNtz8lkGCwWgjsj7mKH4SMcOGOOt3oWn5xCWBfXaPrp0UqaTnczz 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 Fri Apr 11 09:00:29 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: 880415 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 CBED2298CAC; Fri, 11 Apr 2025 09:01:51 +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=1744362113; cv=none; b=ZB54+S0k1lizfaPFg9+lWs5GwukysrutDtfRt+ShBxrESul76CdpSJQjVTIlU6GHUj/s8WOgNwSLy4KidvnxvPkEYHZeLLiF8RDOCbF9TJ4MI0XG2EVWiUmGhZLxhppCUrN4Tl/Uuub+FqoYMt9HaEUH1y0SxicG1OeZs0AH8i8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362113; c=relaxed/simple; bh=iTc/RNQUri37IjlCMpegyjj2hPVvSJ8rCK9az0iWMW4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OzJ4eyAWPLklpm9UAn8QoR+6YZ6V077aHvp2k4xoL9y7HW+MX0vQ+SHyOcGQmDqS2xmZql1tw2Jn7L9tvGQtE+tRzoB+983EHKiMCX8jkWa437LuI125WyqyaHj7NqkB8dytcT7/PuHV3WYVH+eMWfGbaUIPqblw8bjX5hr3S6o= 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=VuizJtdz; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=tl2nKwDc; 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="VuizJtdz"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="tl2nKwDc" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362108; 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=tMe0g3jwXR/976+VePxD04JYud2yUWQle7bIApeWz3U=; b=VuizJtdzBqUgiJg0WrWE2Y5azXxO9KAvlc4dfOv9pOBvC/hNlxpT1WP8C8xIkM9zucDtN3 a94qGmAq4kMa5z+TyiHi2XUuhxywgtg7Li4NwU4209+0O/RMdvBES1OPVQltp3dHGvu5ZU G5jL5R6llpQHzDdqhVsnmNOD5BOrd3A2c+DNw0pVFBXBuqMRIspWHgEXxYqYWgwkXxK25y 5z9sNm2z7ju6IpN9d4iM1uUsJThvtFjf09JT1Dh3lpElZfi6lD4B1jbyuG0EINsVHI5wCc ZDY0g+ZMrlTqQLrz527R4miYQzGqFyzXAon1lNHFM3Y5Sx6coFoPOvmkhNB0JQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362108; 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=tMe0g3jwXR/976+VePxD04JYud2yUWQle7bIApeWz3U=; b=tl2nKwDcDC+mD40i4VfFK0Q/Zqw0JbPmRqBfNRvLfGQ2RYvLKQnsZwZmL1HFfcr/PEGL34 0nzN4kuMBzlUnNBQ== Date: Fri, 11 Apr 2025 11:00:29 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-5-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1419; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=iTc/RNQUri37IjlCMpegyjj2hPVvSJ8rCK9az0iWMW4=; b=8YgHapG/pY5M0wvPiR+V19Fh8iDIlF7p3oNQQLwFh7GgjDhzKY//CgMTYmNOonl5pPZn/twhc gNdQdCipmaTC06WFTBuUFrMsytLMMmGHPjmXATWIe11xi70cBo9ocpD 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 inline 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 Fri Apr 11 09:00:30 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: 880414 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 7A5992989BD; Fri, 11 Apr 2025 09:01:51 +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=1744362114; cv=none; b=IdEqDEBQAFmsrXLx1jqh0uBMWyQetqRj5jtLm7K4WO9kprAgFdzPT6u4zZM7iFxYUpOBdWtrvAGukRjtUIBON6YMQpjDW9JC3pjZQHpjRNYWazMKIWf2RrbLG2VTcOFUuTuPmoeIu+75ri03zyOKnSIwO5S9musyjQh3lDekNIg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362114; c=relaxed/simple; bh=X+BMimOr27k+/lCB8IAFuJEQitOZeP8NtZG5I0zUYoE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rO5kLF5MejfesGcK77rLpKQJY2mVsB64Sd4I50pCwoPKnqcem3xAnWSYF19aJ/Z6ts+fFywHVE0c5znAU48pzzSuilneoN1oOVDLudIWZZQPvgALwT/OOnLgjFzOwLOy+um2DkP54W7EMi8WwHcF3KhCnYgTV1UubjjZDEiDXVc= 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=1ghV41ak; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=tnxh4Rq7; 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="1ghV41ak"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="tnxh4Rq7" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362109; 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=wtICgEwn39BNK2RVwM0gACpiOULlMkuI9K6OeLRKX6w=; b=1ghV41akaZSwLQ7urFX89khrmSalYn0EJp0/t4podAGy1uveW7dJMKGyPn7DMZWul5Fjcc zi/5isGpJcYAIiS2Ytm8198ev0cz/GrvWpWBpua5OLuqKCb8v1PIUnpI7/7RffmkFVcS2q MOTaxdIln8zu+GBCXlCpSr1Vl6oGqB3PigzpkOHwARaDRA7dLa+8lGJJ7U9ScLQlb4Efo8 HQHSxgi/fesbM1afnMwWXANIonoQzL80vt2AObhf+JUVcQwvqP9rZAqn0kHNrFM/m1a0s9 0gjQoWRtyFkLxaIVKkDMGzrRkbEVrqgjoSlHxVvEhUH+FsAK8rJRO4619CI/6w== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362109; 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=wtICgEwn39BNK2RVwM0gACpiOULlMkuI9K6OeLRKX6w=; b=tnxh4Rq7BreL3AkcMEmUE63b0xNeszlpzoFZx+AMPDD4iUlSMxTBwrtCtdVU09OXi4nlcw LbpA7VfJMDP6VXBA== Date: Fri, 11 Apr 2025 11:00:30 +0200 Subject: [PATCH v3 06/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: <20250411-nolibc-kselftest-harness-v3-6-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1409; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=X+BMimOr27k+/lCB8IAFuJEQitOZeP8NtZG5I0zUYoE=; b=Im72zI7x5XtITNJyoPf3w6jYh5XXgB8/srkQa44p0i0srwGO/a5ubt4hxFxRNQ4yqEUMrkwL3 VgEPMKsuE/YAvyc15OO1qiLCDUcJA49pye8H12jtwSr+3GaDDHuEs0v 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 222a4f51a8d704c41597e09a241ad887ef787139..7ec4f66d0e3d7f129f6c2a45ff58310dabe5d03f 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -439,12 +439,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 Fri Apr 11 09:00: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: 880680 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 40131298CB6; Fri, 11 Apr 2025 09:01:51 +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=1744362114; cv=none; b=CXU0XDVqmUF8OIXceF+4Y8Vdru0Z9BuYmdIYrszKTQ+QZV3ZhpLBHOF+sEkBf40LVBzS+D97eB7LBuNWIz71aw312OnN92hL3OWf1MZ1KjYaVKCXAbNs25zeb6gDbDMqPqqycdaVrqF+ktlM9AZDsgD9EFK7Owo0vhvYDQnVMNY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362114; c=relaxed/simple; bh=r6JpdnwhPhz+im8TqjbnrgSDKNsfsT/11y9RKjdGR3Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EanxSsGmHwszTP/h6EKtLplWT9Ple3uHHsGflJSrVbten4yEQxN2f8Q2ORhHlJUkDvQikbEClhY69DrOTyyY8vjwp1PM7+XfXX5VaA1yY/6Dulpy/oidW5KZ4S+h3klfOiDlk6uPhi64xbMwo4LiCfuG1hFQakq80LLE5Ks3q+M= 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=NRuU47JN; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=MfcCDUQj; 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="NRuU47JN"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="MfcCDUQj" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362109; 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=L/OJuvVvDrAigQ+IK7AJllZ3yppJfufMIGzq2EMgp8s=; b=NRuU47JNsRNj2qV+jpgk6yxVeMMxd6y28aYG9LIFmyDE4R5YExJCtn3HdQEpY1hbvK+Hqc wQIR2yM4G1ldKhysRxS8JqYamQEWeKHFn6KJbywzf6kfDPG/dS3HvVCQD5K61ZlyUnG9rR 19Sj7h4KYh5fquY9oerYAvvLQwg6x3INhd28Of6WMd1Z7puyP6wwKgePnPpbKThPigd0SH mCRnEWZvAV9FovDttXacc/s+iKctKbnpxkqpJ6ZyNXgzPhSaLuUzf/jPziI58W5+fW9G2q 2GU2eh0Dh3SYEshJEJsC4FNRfkhqED5Ww0WuZd2bQZCLJ+fi0sBCgFM2YxfMPQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362109; 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=L/OJuvVvDrAigQ+IK7AJllZ3yppJfufMIGzq2EMgp8s=; b=MfcCDUQj+NHcTaSpPFEJWj0eMtdy0PBqtkU2rVDuUrw0Rte6rQZbfUjePnUTknO/r2GjkL YpeHIGX3H+9QARCg== Date: Fri, 11 Apr 2025 11:00:31 +0200 Subject: [PATCH v3 07/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: <20250411-nolibc-kselftest-harness-v3-7-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=4081; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=r6JpdnwhPhz+im8TqjbnrgSDKNsfsT/11y9RKjdGR3Y=; b=qLhSVOfAv+ilt8LLoaamoqBABA2l80hkNJNjRklD2OF0x6laYg6EmWtLoZMr7pPAP4EdQ76fV CYfGg8dhXonDwANRVWt7XBWER3cgG062uQAVCY6DTY2Lh9YWzqlXpmn X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Make the kselftest 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 7ec4f66d0e3d7f129f6c2a45ff58310dabe5d03f..1e459619fe8657d7d213a7b16d7bcbc58e76e892 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -56,6 +56,8 @@ #include #include #include +#include +#include #include #include #include @@ -914,7 +916,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 */ @@ -964,75 +965,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 Fri Apr 11 09:00: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: 880681 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 E419D298CB1; Fri, 11 Apr 2025 09:01:51 +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=1744362113; cv=none; b=M9gpdQVlDkwb2WtpTk3cr2HRmXgWn2yoKxn8jXndRRrHjvo6GUPvkdXUTC2cX1zv4sjikHQ60LqhxruVrkH4zhhBea9bQ74DcL7bv5K0BMHIfS1UgOr73Ax3ctOwASRdN5/rN7CCJo5++teNTCwMVLWLFvBpIJMu4LDh7NgEo44= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362113; c=relaxed/simple; bh=DYq0rbz3jmlhEduwTAuGV0UE7Ds8U5rzr+9vob1udYk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ub9hx3EEhSqjZtbAV7WkU8wQ+0/8lF5yqW7/3kgZlZ9f4YoVoYZDDokZ+DH3lMAZn5SGJjKSPEQgcrsvp+eXZ4tXqlMfh4Msl+11FNCrKeqWU5Aq1mf2tUF/seJCjTt6FRsYeRrR3H0obVZLxpMavoV2LV1vDozKcVVIkkegNpY= 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=oAiz2VPK; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=UutyLoWG; 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="oAiz2VPK"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="UutyLoWG" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362110; 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=Qg3M61XE6rp6LYbeiMFWtQMLhXgLKx330vGb2tHj74s=; b=oAiz2VPKoqCFjua9EstODh5uRBB5JT26EhynUkw9u7JAKlEkjZJZaghTM1eu7M4ev8BW57 PJnF6M+D5ailDgO6KBJTTIY+m/lYAIgSQr33nxc6HY+AJwCmExSAqiOLIyIYkNM5eIw5i3 +jGwX9/ccb8TlxCV/4raY7/kB1cZ7Z9ZXJLuaf5Hz44xi7vLWtCDl8ByU253jwURDo6wg9 O2p6dBeZJ5pEJ/dPwY6FikE6cdYUL2kmVaowEZlam7ait9rnkVylZz2UfqfN/DW3aI2Hro 0TZYX67jv9+8UtJfRPzUjKthlEMSE7HPeYD3nY5X/sQgl8MGxpYJwc+6YlX1eg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362110; 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=Qg3M61XE6rp6LYbeiMFWtQMLhXgLKx330vGb2tHj74s=; b=UutyLoWGsjZcKBhKKomWvMPg60WTrDaEduT63KQ1ldU1th/uKZQv+qfeOABX4n1DZGs0Z6 ahUkxUHY4leYt6Bw== Date: Fri, 11 Apr 2025 11:00:32 +0200 Subject: [PATCH v3 08/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: <20250411-nolibc-kselftest-harness-v3-8-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=862; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=DYq0rbz3jmlhEduwTAuGV0UE7Ds8U5rzr+9vob1udYk=; b=lgB9Bn/YJBOTVV8FuM39D8RkAbpRERD7AErOPC+EY3mT/WH18iIZ3NfOua/Ndi9lQX9rnt2Yq XGM/4Pg5GCdBYxAC9bMISl5RTD4IU1djOEAtFEORi9zmRfVaH7//00u 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 1e459619fe8657d7d213a7b16d7bcbc58e76e892..905986debbfb0ce8c9659dbd52b6c67c6759cae7 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -178,7 +178,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 Fri Apr 11 09:00: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: 880413 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 D9A52298CCA; Fri, 11 Apr 2025 09:01:52 +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=1744362114; cv=none; b=oZ3YBtKBpd85WOTn2mO8rRD3GCLLUXVw2sx0tq1BfK/07gyrlt/jGHsBkbMARlwXToYrFekJkMPaccL/NYGktbO7m8zACQngANUbpaKtKjZDltiujZqmKzhMjcfhSa8QYSLbkfXAfVwhBW0cnJl5ahD2FphnfTHRKIZ7V7lAXEA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362114; c=relaxed/simple; bh=BVT171KPOVJVjfzTPXmBhG+I/rvwg4GYgQn0y8XhdF0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HZpwUK+DKcQspX+8cGG53LZZzFeuln3FYVeAez3MxNzTsPLMydiWY10qtyP95BXFwCXWnMgW2NmE5aO/bfDSnoAUCkQJm0k9tS7VUnqIxXVwS8rijwTSsCuKzNgi15FCNDo4TUsdBOmZE+D7pr5/OedF0WUMY6nNymMreJyRbvI= 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=w8ephqr4; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=uwXooJ/b; 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="w8ephqr4"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="uwXooJ/b" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362110; 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=PfHP6lDLf5mEBPgKe6QaxYDp7DWXdQcn3ptsh2iol5E=; b=w8ephqr44jeknOTrmQuSC0azDs+LLpv03987OQuDvtYlekDrfbE1JMuQfw1V0YkxEoykvk ldx9BZ6FWUBDSCJ2Rn4h+Mhs5LGelH8piTXz+vvFOg8mDquxFnmyq+8FlPTCRfMFtielss 7Efx5SYyIcHkKr6Neeufsh0gfBEAO0e23PQUHP/fCHDfVrDON07GXcPbjsLADsFqkhOIrF BPbu5X7Nqf2qTiGmY0OrIjGVSYd1f1tVbSCttEhfnZ8GNkHrcp406eVzRnyRhqzSgy97lj sM8ruVCUJeZRFNMX+y9ZqyMWIQaDFrzuR0yljb64Bl/y712d+jVeEeulohZobg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362110; 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=PfHP6lDLf5mEBPgKe6QaxYDp7DWXdQcn3ptsh2iol5E=; b=uwXooJ/bkze83Ndkth12mXwO6CddYWvLD88efqB0B/RkCAfsmL19afvepVhtMTJqiihJ69 I3WltRHHtfcbM2CQ== Date: Fri, 11 Apr 2025 11:00:33 +0200 Subject: [PATCH v3 09/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: <20250411-nolibc-kselftest-harness-v3-9-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1726; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=BVT171KPOVJVjfzTPXmBhG+I/rvwg4GYgQn0y8XhdF0=; b=aE1YqloT5sq4xow8ECRqaLDPl36mLdTU8dQGj0XC555BvnmnlRrQDIhbo7rtJXZe1fqDzafs8 YA3d26AOHXxBKzYxHVj47cdKMAL4gJEdzmkGy1B85V+T3eZjo4zzcUA 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 905986debbfb0ce8c9659dbd52b6c67c6759cae7..4038ceeb42a870a2b77c6888df8a7bb4c4a258ba 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -173,13 +173,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 = \ @@ -193,7 +193,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 Fri Apr 11 09:00: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: 880679 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 D991A298CC9; Fri, 11 Apr 2025 09:01:52 +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=1744362114; cv=none; b=C169FWhR4dAt+1R7GCIwC4blqPuMhhEI1/kVnHdh5gaQtwVl+YJ1CSiufgrT9z4JVvEeUL/ssqYWzkUiQvTaIN4xfk3hT2UxfyWurk3vQGvCMvQ7nfCYJnymXrvkSM9yJJ+1Jc/cUTVITIbavz+fjik1azItEAiGH3dOy7ZDuiM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362114; c=relaxed/simple; bh=xsOgqpVF3xELBsCaLrwDdUg/BIkBndVgq3S6YVEJtrg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JwxNrFauv8kzur9qTJdwxsGmM0Ri3Zbt5pKvBlOmX8ZZGkOFKU26oM2nwYZNFwlHRYErChV0irOG3geBS03EC1e/QjvNaF2pP20JEAE5MepsgSCMXboZ7oejQqcmVQ9LrROw8rtd86NqwQc/4iYvrEFAZRRazHw7YVGtJ3GyJLg= 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=y7jwhrgb; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=hOREmIdm; 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="y7jwhrgb"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="hOREmIdm" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362111; 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=s2m1ytKmJLv4W19Ree/8QxaUIOzVWzU9VNFHgbO9ms8=; b=y7jwhrgbMelEC9ZAWQSRGCxc6Aye+zeJMDTmyshDbVvVvOyzhAMeKghhhDGplO0Zzmn9u6 DFulllaJpDPfXRiwlaxnRoldZgHczddx8o6K3bUHBl+6gZQ20/1DQf7Jno2D0Zwk8k016Q uvJDdcrx76Vmk2gY6gvXiDj+ecAtIkRe493/+7mHkveT9FUiTKt3ug5VHlS0qEuuK0nyhl Uot5MwKk1SBdt/0zK9fyUhQoi3OR/8PmtSRQu7ZbfuezlKxiZjFh0r5sv8T8y5XN5dMjIr UD4iul7Yq2J1y5ZrcCfM4WT6xpfeqxnfh/3SFC8UQkaNEajZiB0jsI06aOmhnA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362111; 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=s2m1ytKmJLv4W19Ree/8QxaUIOzVWzU9VNFHgbO9ms8=; b=hOREmIdmqzYtIE7QfqDK064qmxLhY2XAI5w32R2m/14/DOUdJi9vpQFog3nz/3jpzbIWPG PzXwUS/RWr78dACQ== Date: Fri, 11 Apr 2025 11:00:34 +0200 Subject: [PATCH v3 10/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: <20250411-nolibc-kselftest-harness-v3-10-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=3443; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=xsOgqpVF3xELBsCaLrwDdUg/BIkBndVgq3S6YVEJtrg=; b=RCV1A/6H22+aWPhnRQS0yuQAG3k/krkwY0b7LizfUqsOQnnqX21OReqJP50Dff7c5lnxW9xw+ LQMTODnQzmmCR4+N56ilySXWe2kxmuaC2w0dUOi4OjsD6ZAZGde290k 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 4038ceeb42a870a2b77c6888df8a7bb4c4a258ba..790445c541aa3875d8d42822ab979295cc869d39 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -413,9 +413,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, \ @@ -433,7 +433,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"); \ @@ -441,15 +441,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)) { \ @@ -918,7 +919,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; @@ -1197,7 +1198,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 Fri Apr 11 09:00: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: 880412 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 71F11298CDF; Fri, 11 Apr 2025 09:01:53 +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=1744362115; cv=none; b=b71LQ//XThsvsIKd0wS2NsaQ3PL3Jp+WDcPenRBwFWw3SboipkJWHAf/7DwLq9rXptSFeAs5qX0uNOd7moE87iKRcNG6cCPNaMc2/DsNmbAeCo6h13W+uXjsJsMvsFrtQ4wvv9ulp3ReIOSXGXdDgecTwH2S8CA+JTi4FLhH5dI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362115; c=relaxed/simple; bh=LGVMuklXgCkpJyincccVHRHsRYbHKB8kTUjlwhV0ovw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IQxEPRwY13h4SU/AwJlfmlwkWGiocjHU1lH5SS2x3bJY8rcIYt8iu+NnTyMAX0EnUwlBGJ6lGdg+ZEty3quAxwpGHHgRkeRl+9sonYxPwVoLjUt4flBWwNJrTLmCA/K9saYvE/aCZRTXYZotnJZBerjkk2Dt4ifLwf3mSZIUC3s= 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=FN7Td7Wb; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=7G8B7I5K; 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="FN7Td7Wb"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="7G8B7I5K" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362111; 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=Z7VvCGnYllIwWlmCyX7MyWOjcCjHF74d/AC9380lrt0=; b=FN7Td7WbVj//5bhgC8Sue7qDOKKWCiKFQVOZhDfzoEJunTuF0GXNCuPOVMp6AB/HkoELfF gTviTKJC1/BYODUHegPMraBcmJ/Y93ertJ/qXjOcP/pUWELyw5CsBfM8UUZoYI33HyDsNs MueHtzi+8zpKyvUqDkpugOc9R1auZes2gY4i/jp+e4yJZuV9s7oh7JmnH/ebAMAXCYX9AU qhPxEiG6gTFgQ61TSkCxGJyOO6iMcmRjtqNp0PQSDscWso6Cv0MYhT+LHYGZKA7ocRdUAU FZ2ppzYLDO21xwglj06vSqff4p9GHL1zk5eHd62HEtEQeb94jHH0R3FJA5tZ6Q== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362111; 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=Z7VvCGnYllIwWlmCyX7MyWOjcCjHF74d/AC9380lrt0=; b=7G8B7I5KzlBh2ZbB3HjwujV0zM7BGn6PbwFzy2Qn7614PD3v0uoL2mWv+ZP6x0vVm1Y8Sw raQCSkOmgVL68BCQ== Date: Fri, 11 Apr 2025 11:00:35 +0200 Subject: [PATCH v3 11/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: <20250411-nolibc-kselftest-harness-v3-11-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=2758; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=LGVMuklXgCkpJyincccVHRHsRYbHKB8kTUjlwhV0ovw=; b=MSwLorvdyFqtJdr1shsNeIruj4rE0vaKAB7FtnDoPy3GOy6s/mbSzom/aGaC35vkf+ybn6T5w qEtq8IEpLbBC0b7OiU1Ux+bxZi7zJUdaEVE4htNSNJQaMBJOwruj+ux 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 790445c541aa3875d8d42822ab979295cc869d39..5373b8da8886aef5df3368aeff95080636ae2343 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -441,14 +441,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) \ @@ -462,6 +458,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) \ @@ -471,6 +475,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; \ @@ -914,6 +919,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 Fri Apr 11 09:00: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: 880678 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 DBB6029AAF0; Fri, 11 Apr 2025 09:01:53 +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=1744362116; cv=none; b=GYi+tDfNxal1Zit9fB4nojeAbX6F9WkVd4i3dAM3rTZB6lp+ha4FV+iIqvlVedy9TFHQPrHF5tmLxg01MslrnXmBkWeS08EU/iNksfKS1oP3nV0TtfP8SZUq/7WRLL/GPjCh4WSugP2n5ZNQF8OxFplwndkK/gDkw+XDLzSn0hA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362116; c=relaxed/simple; bh=ROPqzxq1eeM/Z2SLe3nArtedAx5wJL7q5hTnAUzBZ+0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ti5sVwXMwPZZr0PrnrL2cqv2xK0vPGY80GTGbF5o/KTvi40Ld7L6MBpb6ZYNgKk7vHL/MWy5vOUiKcXCy3yTkD9GsAUTENYVH1VDCONnR+lH9Xaar1uD/oGhfDqeCfLPpj/PfpctYAMTbLXTKUB6h1cdXBJKlodYxMZ982uG6NI= 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=nU8uQ20w; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=nu6Ut2M3; 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="nU8uQ20w"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="nu6Ut2M3" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362112; 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=Nw4rcpI3oL6Bs10R/XzcuUCLJVM3NVoV8YHTZBkuT2U=; b=nU8uQ20wiizde0TMxSgsxVec8M0UqkLdga3Uq0jl8mv/6e5fQVUxWRtRQXTPtZvloStwLi Od4Cj2dmyCN4W0ekWLUX5rBel6BC8zPMtCdVHE8hPfXxhpZHLlofwpAedudbmuSq+275es J3Y8fsdTyMdMPxjsVRwsVTdT6mQjtt5TEW9JndgKOanSpKUNz7eK61RGAoeM0RfRV+Kmrp Y0PcQQSTZI0tEYQ0tf7spodC/nb2ejQk2l+Xnu+Mo5ADFJgfI1fHd3eIhrvD1YIaIOYld8 KyNYoG5p6qNjaRBlKfGoG9YLBHZlXldcqky86Cz5Yz/nAVqm+BkbhFycPdGo1A== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362112; 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=Nw4rcpI3oL6Bs10R/XzcuUCLJVM3NVoV8YHTZBkuT2U=; b=nu6Ut2M3klYqvLLd8dQfeNhJ3kX+7bVLDDUTteVHECg1DnPKBqwuCMKEIl3ohHjM5QBlZT DzW3YXqrl1i155Cw== Date: Fri, 11 Apr 2025 11:00:36 +0200 Subject: [PATCH v3 12/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: <20250411-nolibc-kselftest-harness-v3-12-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=5100; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=ROPqzxq1eeM/Z2SLe3nArtedAx5wJL7q5hTnAUzBZ+0=; b=i5msfMsukLXfbShCvDymELpy1/tOoVE2RZSkvcdC69e9brzbt3BvbPVaDdjVCigs8C4EB7zmt pxDuDUehSYSDdWxbAK/ciopJZ1avokmW7NHSUBHJwmTysKVyEdvLJp7 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 5373b8da8886aef5df3368aeff95080636ae2343..1e584f39a42023c400988dea96f0274d4dc3645b 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -67,7 +67,6 @@ #include #include #include -#include #include "kselftest.h" @@ -178,9 +177,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, \ @@ -425,24 +422,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)); \ @@ -456,7 +449,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, \ @@ -757,7 +749,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)) @@ -927,7 +919,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; }; @@ -957,23 +948,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) { /* @@ -1206,7 +1192,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 Fri Apr 11 09:00: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: 880411 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 7F22929AAFE; Fri, 11 Apr 2025 09:01:54 +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=1744362116; cv=none; b=RXimBsWyVBx+mpZBkDj1gxFn1ZJ6uCMsE7u80+CeB0umEDbEXYhWBMo5tpAqrqD97T98nimgmHhOLxgUtpExx3fvKZqYjkPDe0Bh3gUjhgFBmmpi0UwWuQTcDVI3/XuHwbMBIXEc/ml5UotQY7fYCORUTh0KKfu4fK7UeFugwwM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362116; c=relaxed/simple; bh=6pkon7Kh5/SE7q0KZvHsGJsIG9RSM3sGqKstS7SVzkM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nzLH3YXfvYPqhd7mugnPs7qjdyKofhZm8j4Xgd0iM1PKpsLgB0jkg1MytXI3gmf6cLypu4axoymjS62Ug1b8poS6kjf31POUz7/s8UtV/opyjGaPIuvZXsdbCCstAvsN14WhuhtRuSoPHtPBNJFHj1LjcsGZbdcFOBFZCWTnoaA= 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=j0iKOsu1; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=qlF/havO; 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="j0iKOsu1"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="qlF/havO" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362112; 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=pv+09698FZpTal/X+RrmmE1s8VEJjIksZePhFfpyAqw=; b=j0iKOsu18oiEUNgNOE8CVIsb0H9sim8pETp6mzxBXQ3f4vqffu9nGARXhmOnm851ieq+vy RMQgR98SohJanuy1CRRHRbIY5lUCZvMYoPhKVFNiEZTTAYkTxXtzBkdC1jNPxTLBHRyNWB g6lLcz+56a6b7QGxo2L6lsBq9kufFTRYqVsIH+sCjgQUQFL1edfmXBqG3W31hkbkOlB79I 1AgcFY1+rhiYQBWhjcTFaqXv7melegvl0nj0zYjpAskrDdQka1MRfj/XIRZba4gbfjtH/K kDKEbDOqGLK0KlTJcqqnYdr8znovtj+jlf7bzjGDpIJ+pwbqZtlMs6+EAAVFSg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362112; 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=pv+09698FZpTal/X+RrmmE1s8VEJjIksZePhFfpyAqw=; b=qlF/havOm+ShT0iGjIKdYWaYEQCTm1uNPlv9w+EjrOEoP5+5mebyYqMww7Saa7rV4MMHHH mfAKPRblecQN7vBw== Date: Fri, 11 Apr 2025 11:00:37 +0200 Subject: [PATCH v3 13/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: <20250411-nolibc-kselftest-harness-v3-13-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1082; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=6pkon7Kh5/SE7q0KZvHsGJsIG9RSM3sGqKstS7SVzkM=; b=nkmvSPwyAfvw3Pmbz00BOtB0EXSLxcrIheXUDR3XoctIlWrjySQNDF2oYWyqVeWSfwZoXzS74 YB2vstKp4UhBAxH7uKy1wWn2jj/xooSkabPEX1ImpuEsVMqr4/wrmtX 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 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h index 1e584f39a42023c400988dea96f0274d4dc3645b..4247c67b3060fbe9d224c1171f3ec998ae6b1080 100644 --- a/tools/testing/selftests/kselftest_harness.h +++ b/tools/testing/selftests/kselftest_harness.h @@ -57,16 +57,19 @@ #include #include #include -#include #include #include #include #include #include +#include + +#ifndef NOLIBC +#include #include #include #include -#include +#endif #include "kselftest.h" From patchwork Fri Apr 11 09:00: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: 880677 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 D2C8829B201; Fri, 11 Apr 2025 09:01:54 +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=1744362116; cv=none; b=D4QsNQULxN4fwgdhMvpkzg+KpNMUhQACgVvkunExSs1pYImITgjgTax8gAXz31cwIabqt8QieTH5g1Kfb8NgNdZVFDe73nIoDNfq/KMnjd81zDK60EJaqHZGFvNPy49jVePEpN+C0k0dbwDFdZo9W7xwXUNJTVnuIGR3B5rwZ0g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362116; c=relaxed/simple; bh=vziCUdNp26ABjp35XwXDT3/Jp4kbGW8VzXFVpyrSY4M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bU9CrffFyRzn8xkdst5v1b8jwkgz/3RUfC1UM0dl55SaygYp6AwK8L7yyzfAuvk1KxrLHE0nEac/R0n8Ph1UXjtZy70yN4oBBbkDtEkcmvyB/q1fNiUbeX6S86EC8lfMPz5fuXH0WEB6uAWERi0etGEbo49EtClAHL1xJPeXYzk= 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=WXbZEC8/; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=zd42oo+L; 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="WXbZEC8/"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="zd42oo+L" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362113; 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=pGXtZX2jgI41oXqZ0O6HteDy6lpCTkO9gddogCmzDs8=; b=WXbZEC8/ShQ6z2aCvZCIdIh2Rhv3UVnLYlkRCRZ81lVOJotzqs/DTYU2hf5LFGaDu4A7mO DX83wHE40LKHnipoTQzLAvf7ngRVB2NkNLfX7RljB4JE1WtqkDvccpmfIV9DulVXhyUgLu bOJhGdMyMx5h/j8ySd9vDprDBgYquFNG3vBsdBrEge5J7Z85FEp1vUc9NoPpBwRbMY624F 6Saddn8G7G4ENp0IkjVkdCo++jVaAdxiJ3XmpuKQ4Z1wEAgM7Y9eUFYWZeLR7nz0veQqxX Ap1hnEY7xJrZgaUQNs+h/3N/zRuwtQ5406JAvQv7J8bpcOlbeIxE43NjfXSa9A== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362113; 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=pGXtZX2jgI41oXqZ0O6HteDy6lpCTkO9gddogCmzDs8=; b=zd42oo+LPjA2hF+sSlimpviSDzKdXP7SU6T3VwfRiIyEZHtgUR5f81ySXNygBIdiQf9+X1 Mg4NVN45t2mjT/BA== Date: Fri, 11 Apr 2025 11:00:38 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-14-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1971; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=vziCUdNp26ABjp35XwXDT3/Jp4kbGW8VzXFVpyrSY4M=; b=PLbqpCC012hKUcWGifHM0QPMDEkkoMaNWpkg74bMxuSu81PMfVS7K+hu5JonzHNQLxg6MCcAE 6N5w7UyN12gDt0CB7eNUcP9IRwSOWJPtQVOHytym+Ei8WeGduODHtxx 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 Acked-by: Willy Tarreau --- 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 5884a891c491544050fc35b07322c73a1a9dbaf3..ccf865e80eb715488f4ee5d623b7a02d9dd8abec 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1430,6 +1430,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 Fri Apr 11 09:00: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: 880676 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 D294C29B23D; Fri, 11 Apr 2025 09:01:55 +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=1744362117; cv=none; b=Oz8vvkV+gcOAo7U0tJT0dfOSHovWexqqAIC0XIqR3rBCePu72CSbPpXHAt4d91xnTsbn7c9487wn0p4wdPCTIkzm3TICxcmyYKez1cmaqvyp4Z4RzUZHCwB7hFdrBD92IORBvGujEv4WlqbZ4X5nhqLNPnKgPBZC2kkEoGxby2k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362117; c=relaxed/simple; bh=yiN7932Hjz9o4Z41OyO0HMGRnPv3dGLSS2woL8P+hvA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IG0jScTWadyes9eYBciVt2Aqv57Lt9mib4NP9ceYoZxZfaEeqXA5+ChhRaI/eJXQ+F8Wwe3bA8EJOUIs2luE04m5VbNhbbUmWR28C+v96AxUSte1bOexOXc4e+mJaKg9o8Dtq5cqHX9bL4Egey45GReNYaqkH9t/1zAnM2xVLtg= 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=ZvIMujju; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=O/eKXaAF; 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="ZvIMujju"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="O/eKXaAF" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362113; 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=icAotOumz5oayfyIPCgSJr46gLVPYeiQGTGFCJGRKFI=; b=ZvIMujjubApixJy7rr5FR81qwCnA3vDf2YE/Ow6y6OjGesyTnHeF9eyXSxemFLBP92fWwv 5CWT8k+BC8AH3FjWbbcb4EwZ8hH159ctWGp0tVYUJNuBNxcrfS8MlLtfnus5yjRCZkMcwT VQggGbYTtI5F0YUTkEaUaFGcerBTd62BxmWFHLCyiwY2cmf8USpxZgZ9S+aE0v456T4FLw kL29LxgB03rpJKQsVgx7luNn6pVQm3ZYxKXlyvumNRa4pTiyZGFNfaGvNW6H/sh6wkKZNT O0EvquX8WrsWLcyw4/JJFzfbhjT4en+HbhJRQdVTJ3OTa5KsNYIWyCAQT4qe/Q== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362113; 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=icAotOumz5oayfyIPCgSJr46gLVPYeiQGTGFCJGRKFI=; b=O/eKXaAFPcsT17sLxnbhgAc4X2ueXzKywlfdTVPaQnQBmLnvxR5i/aKH37QiSJiBnrY5DM 6Lrekjbmzys5QjBQ== Date: Fri, 11 Apr 2025 11:00:39 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-15-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1199; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=yiN7932Hjz9o4Z41OyO0HMGRnPv3dGLSS2woL8P+hvA=; b=51S4s1eponHP+t43KCmD18QFJ84AdQoGvW5V6K/Zt6G3fZhHIj7pOLS2WgKF+l+fZ0Iw6KF4v fOy6XqNSSGeB9dCNhPnrtjFlT9hBqMYx9rrlFV4M7nVoleNvTkZpPye 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 Acked-by: Willy Tarreau --- 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 Fri Apr 11 09:00: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: 880410 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 D289C29B23B; Fri, 11 Apr 2025 09:01:55 +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=1744362117; cv=none; b=ennSRI/4xww29V5R9SY7uS22f+H0qqRYBoiXtLRa69YO6WV+zxGytyrHA3fsNa6BJjGke6i7yW6rq4zKUgUeDLfRmfIE/glsUkQkFqAYznCiZrxV5FSJYHyB4DYl1opgrLpdJrnzZ2u0wZCwI1p+7S/8R+3CZwlKb9fEDXcAeVs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362117; c=relaxed/simple; bh=dNb0DycZOXECXF1uglDgQ5OZ5A0IF51QyPd7mDkmpqQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CuF41fPUnMrTanzRStt5fBKrLDVL1JjRlmWs3t4/PLmIQvzHPBpw5epo74/j/KYgK0ILPku9y9w2jn6QbPdcpmmBp+8+6vzNWuDrdLOgbRtlW2QlftJyMxCV9zws2Y03gla1U8HySqkOfE5TdYiFBUfTHKeCOR+ZzOf764A4+C0= 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=d+dAmASc; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=glbLpOpy; 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="d+dAmASc"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="glbLpOpy" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362114; 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=OqWg6AnaVdBpGZDz7vvxu+fK6BxS8YBbe1FDLG4qoKs=; b=d+dAmAScXC5jrsTck9jISsZ8Cx2C7BBvQDYGsoZJI6o2FrV+cZ6DPBaYlUrXoH4ghv9AzK jTtWzKAcpOII3U5JIzcJMhFRURyt2PSlO7UsZZA05AJheoee9eKkYE526dzEICbsPz0TAX Ua4c4dtb/ydR0aoHXrlsXobflM8ichygIU+WD+bU0WB1n7HDeSVnh/mg0Pc0XhNBxqWhtF fbEgp4BDhmtQqFkA/AcyR0ZG/MwvB+/Oq3w5USNOYfhEZIR3t/fKytBpQqveFAY9eIQ5pn b0eLyhOKAwKHsgtwaDuYb96DFqc3S1sYqi99hx4hPpZ22ort6g6r4pWBbiGKGg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362114; 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=OqWg6AnaVdBpGZDz7vvxu+fK6BxS8YBbe1FDLG4qoKs=; b=glbLpOpyN4/iVCYO9280mqkYT6xxxLGqsr3nQrxAf8H7DKWW6Kv7PqHlZffBMELugcAwQp 2I/X1CEo9EMgZ0Bw== Date: Fri, 11 Apr 2025 11:00:40 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-16-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1164; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=dNb0DycZOXECXF1uglDgQ5OZ5A0IF51QyPd7mDkmpqQ=; b=z8ReeP5xUgxNzaesrylbCqXcthWik285lCV1QVgRrmlxL4V2IzNvWmCOHdVfjKZeZnJXjqEMn y8eJl+FQtFXBf7sf7dF7P5+eqFMk9p39jAGnuA0ykh1gFAnIkxFGdxw 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 Acked-by: Willy Tarreau --- 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 08c1c074bec89a27e53e5d461a3ebbf71ec323d1..a5decdba402236fa0935207f9207c771ac2700bf 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -1023,6 +1023,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 Fri Apr 11 09:00: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: 880409 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 9DBEB29AB18; Fri, 11 Apr 2025 09:01:56 +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=1744362118; cv=none; b=AxydyudG9CZavb2/X3TlV/7EGHoH+qbzwlyNqM+OIMdYPF+o6TtEIA0RqnnAUc+dlZugD6SHgyNgg+Q0N1CYYesTSMv88iB/52WOTPUxoZX3R6dqESjYiQSCfR6CzATgNfSGr+mNb6pEr+WiVHuTQXzGXG/AOxXK1YEgiG3oEa8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362118; c=relaxed/simple; bh=UfwFCU91ffZuTdxNtj6J2SdT3JrHuwqMEWx4TRmx2p4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=e5HwHE5lXVgTavMqyLmEi3i/mxxtdkLAVLaWazl5+EpY9RjSqmlgZ9RHiq2mSPUKt3AiUDWeSEvNyKVhy5xGrsCrDDcm9PmZIXKJLEiNE52xvBAy1rXSqnC4FlA/oXGFnCxwikPrBYaCRHqWhIs0QB/TCWl1rBV4ZRqiiOVo8cI= 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=preT0jVi; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=ZKYg6SnW; 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="preT0jVi"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="ZKYg6SnW" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362114; 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=P+8VoWEW0XZjMSQDsaz/4MYv5EAvq9VHzk9t+oyNa0Y=; b=preT0jVisFbElgnat4CkA/9FDTc7JaYOl5Uv7O5EQ3KDWDoismv8zoZbHxWZYAq0xn8zVN 6T0o78nRTT23y8pO43U07ctiM5AS7fvxZgX6yHFFSjWN2Fn/BXuAw+co6vrbtjOVT+fSBx WhciG6wNoiyhK6ggU09xiTGQWhtuYQS8LOOs5P+O+v1rBcR7pa9Q5Hy7bTHgIBFob4AeoN upNxnW4Frxje15Rf5yLmQ5lZ4TJzG0QyBWVAhVTlRuB9+klqG6xPkE6qgJblKR9gweRl+/ Q6smHPsHdvokOyxCuvO5LMBDsI+7jenxnKNxxZBGS1kWk6feaVKKMZgExI2Jlg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362114; 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=P+8VoWEW0XZjMSQDsaz/4MYv5EAvq9VHzk9t+oyNa0Y=; b=ZKYg6SnW7ENBOKnRIP+8RD4nCfIRbO2aPw2Q5dUWWmRlt1JBo4qlQFUSbd3CqguK6GA6MJ +JmxTq/lpmZy0LAA== Date: Fri, 11 Apr 2025 11:00:41 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-17-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1086; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=UfwFCU91ffZuTdxNtj6J2SdT3JrHuwqMEWx4TRmx2p4=; b=MsRpXMP89fZmvpbwo/ZXjL0ppQDimTgT30Y+CMmJCqC94CSuFrBya6yIM4L6otvSFT8VdWDYJ Zc0X82KNWaaBq/O4syZlhtGP8NzVas7fYeTXnDwxPB7X6Ek1Bu5SG2C 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 Acked-by: Willy Tarreau --- 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 a5decdba402236fa0935207f9207c771ac2700bf..b04d83a7ec50cad7beb32198d9d47bd9d5873f69 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -893,6 +893,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 Fri Apr 11 09:00: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: 880675 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 E0F2829B204; Fri, 11 Apr 2025 09:01:56 +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=1744362118; cv=none; b=oJoDzuVBiYzMK8cM6vtNIHZon6PRjUUpMk2PqKxQW3iN4iPf3g1qrt62Pdz8v5BcfiF1h3N+QryxRF7pfSd+cVrspDNBc8ZbVC5KJYoz7rgUQpsBhRlFnUjwoyUg0blFi+1Cu0xf6+i847Z4nimSx03oWoYLh+N/2vXlbkX26Ac= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362118; c=relaxed/simple; bh=k1JKwXo2zjXkowh2Iz1iHtu5+LVsdl8EjpnFP/4zQps=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ehi6dwmUlivZOn6A20nB3Fuw1/qeuZIIFPSrOLJUGGyccfyIPqRqM0GDJJ2dPBxX9CMjWmSzd4miCMi93X/f0J7Bx8UlaxUBBgnvW3W2TDPcm+/5v6O+MxTsuAk+l0rO9E47rUQpEBfRxw5ulYXPXad+tvDZVyiIC8wNnrj22ys= 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=oO0RO+BF; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=riEYAA/h; 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="oO0RO+BF"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="riEYAA/h" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362115; 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=sSOX1xpNeJxiyfhOoTmnjm0bIp+e5sn96YzgFsrPl2s=; b=oO0RO+BFSarEgfwaY/61MFQYqArzezQOHV3s2scldE79gZleWoKHhBuBfy+ajplS40ZrJU fAcCSvEeA9+fgnM4BoYfDAn0qWIQ3SHWr42jv2GdgLvDiPz9HOd0KfWnB67+i71cen+af6 mKoFTxgjSWaE2158mETc1E5a51nB99gFxyVpXgX+qivnVBy0HhKbZB8NBYFHwjp1OAz99z cqyUM3oFLoxVLkQDOG4dEwGOYXc0HAtBe6d5ZQInI5IIGOyiQPhUraPc1+5qcCpMoe4182 JNOnfn62J+kN/5Jfy/0s3MjdeIs537gzTcGlHohjF1RkPFjjUnhMYK8apokG5g== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362115; 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=sSOX1xpNeJxiyfhOoTmnjm0bIp+e5sn96YzgFsrPl2s=; b=riEYAA/hHOZnycrkYvchP7HY9aJi3OfhnbMvMLof1erTZOsmoVzJPIzHMatTzVnplIjlsX xIoeKufHwpxIkKBg== Date: Fri, 11 Apr 2025 11:00:42 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-18-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=2208; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=k1JKwXo2zjXkowh2Iz1iHtu5+LVsdl8EjpnFP/4zQps=; b=HW6uNre6Z7SZ/h96/FqB1eblGw0acCRiD8C7T13Nl9iYLQjpMXq6KIn/6zygBLkIJ8o05jU+u J7vR9xrghj5DvZPKMyh1el4XpAR1RBF7LqN+a+1w2u7bQheJnzmQvvy X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= The kselftest harness uses these functions. Signed-off-by: Thomas Weißschuh Acked-by: Willy Tarreau --- 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 ccf865e80eb715488f4ee5d623b7a02d9dd8abec..70d418b87f7731572b85d64a8128c62d01df6b2b 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 @@ -1281,6 +1282,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 Fri Apr 11 09:00: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: 880408 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 8F92329CB3C; Fri, 11 Apr 2025 09:01:57 +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=1744362119; cv=none; b=YRucuI9/dWjJQ/DTO5BQJpvVlhbiZkKaWk0jmuFZCi3WPguuErPac2CahGDjKlX1zE4oi90SxAfrN0gP+motP8bHeFZJrMzIa1Mzwrnec8dKI5xoCkSxYykI2FU8mraaZt7YbS1pJTRBxGzJTLExbp8tY/LxunIm2hei9bDh4iM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362119; c=relaxed/simple; bh=57F0YmhSlN4tFYcLaIwl/LaPNC82JeponEq16ncbsHI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bD0qVKl6t/J+4K1HzZ/lg0is6I8yD1DQ7LTE6J4JtX5OUBxtViHjwZgyg/cNI42KNPKyIB7URS+wprpA2cCZbLldlRDuB7ydH6aM6Qr6MyCDqzHMSo+T1cRS9r6PVtKgJ1CH69U9zCjJJzKjF2uzKSWtGn3N0oKieIzUfJJI//8= 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=LbYFVp5u; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=fpTTvUh0; 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="LbYFVp5u"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="fpTTvUh0" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362115; 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=lCm7NpzwzHwG5QyiMDAKDL8vf/JWws+fnKfEgWpTx3s=; b=LbYFVp5uR9JvM8j18xi31KyucTVrMCU2tgjxWngOwBBENFGMDBO5TBnjc/UjElUZFrLrly PxLN3A4KwQll9qaXNGzdKh1jZPDfGcpPQNxW8x4u46eXdbNf0beKyjNMGIkN4msAp3D8dr XBvuq8s77IvMtG1BlpEeS7vSTjFWku7DylCDd85X/GLaWjOcXzlTykMEMGLXy1ulpd7j9h VSKy9j/bkfqWSWvHnB0tA0m7a2pW4ZR/nAcIkIWhAqW/VYyCq2V6pdQjzLeP5LbJD6HnOR SOs7Ocd3EREozU1OebRhg53QAR5iLyVCCWYCJBc6r44px8N6PLtM7erM5F7vQA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362115; 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=lCm7NpzwzHwG5QyiMDAKDL8vf/JWws+fnKfEgWpTx3s=; b=fpTTvUh0FtlhRPqeCRLaQbfZ6l1+mTHWduZZpNk1RJwVWfkg+e3Yi7WoFaE/Z9N7NWMOAY O0Lj5gSlSa37yECw== Date: Fri, 11 Apr 2025 11:00:43 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-19-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=912; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=57F0YmhSlN4tFYcLaIwl/LaPNC82JeponEq16ncbsHI=; b=CxlqKJ0GWfBQTx9yR7EeAsp7d69aTZGd6t2kTPVbGLZQGu2uwmV/NmnazmPYg8nbOZ3tqGLuG lKF6WKrWGwMBXteoHCGRm8C1p73sgnglnIDSUCtjIqTH/8cKMd01zND 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 Acked-by: Willy Tarreau --- 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 b04d83a7ec50cad7beb32198d9d47bd9d5873f69..f52e1953020945fb2902d47ad5f7a8e7c2c1c290 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -301,11 +301,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 Fri Apr 11 09:00: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: 880674 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 96CE529CB42; Fri, 11 Apr 2025 09:01:57 +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=1744362119; cv=none; b=X/IgbO9kpKBNTHeo0l2aLbQlhHFPvNz5yHa262HG7i85ty1B/UoLLWZO13zNoMbg7rxdGZBYFjFUxKiGCLVgaH8+G0Snez/mVQPtaHgGljffauQKRy+FFUFErCh6glgmh8gxgNOHJZcXuEM+uk2KKf0jVXuvbMar+fuOzyv/VMk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362119; c=relaxed/simple; bh=d5MljKKNkutS36nrGWCEFbpFryRCK+Ka8uE6LBhTqxg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iZZSk3ri2ePZz0E3zBf/8ZyWmx8ewWCj1F8JEIUHSN9STLTs9IZ74JIQ/mhXlNckhvARxcVjTe2SnRfxUKIB1iGj+gq2Xl+dbLYCWuy8ZYbHYzU9OeKAutRkNwPPvf4YVzAgVYiJytAPXVFFGeBfYzwla5B4Jj+BG0Y/PBAHpOg= 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=1hduLAVP; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=qMQyxFAq; 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="1hduLAVP"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="qMQyxFAq" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362116; 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=EGIsurDNbt9wfy1oRuJrCVBPEF2XC6rkda0U4p2igXs=; b=1hduLAVPSC7LhNDkK+oh8ubI0EjAv7Ii3yWxRtGfgrzhCvZPzvsKezyrkC8gUEJTpbvg5y na5dYNRas4qI8bttYdXUBY1LFFqLvziGfcWjwFwJge2y2Hm+kIZOf7erLtzU/A0y/nqCg/ /Jf0thRAFupjEUFAH/FIQw+DBG1GqWrD+Ywg3IatnlpHTgdt+cLwQbFuEFvcS0BFDLRTP0 x6lN9j7lAU1nlHe8u0MY4tez+DLA2IPWBLBC/CXl/6Fy2eeZJxVaQ/1ysp9lT+KLdksjJY CuX7+YHK8uCUxu1KLQ5jkQ9Mv9RDZDNoSVFZItsrerxBMr/lf1V3+zy/jRegYg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362116; 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=EGIsurDNbt9wfy1oRuJrCVBPEF2XC6rkda0U4p2igXs=; b=qMQyxFAqGGSQCrQ4UsmlO5iBxBuixhL1HYpcKBWPXMh4rRthmEUMSnb9su8dnUim7XebRl nOUfOIp/XYp/jYCA== Date: Fri, 11 Apr 2025 11:00:44 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-20-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=772; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=d5MljKKNkutS36nrGWCEFbpFryRCK+Ka8uE6LBhTqxg=; b=ZLeqnDWJ0xdsLz7Aw+CfdW+YpEgafYTrPnjVfnhMPj+X2R424VX6/7x5r/mhazV+5ggzWVkXV XboC74478WmDtiEAxvflsLnH4pvtbf36j/VR76mxe02zMopq7A1lyue 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 Acked-by: Willy Tarreau --- 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 f52e1953020945fb2902d47ad5f7a8e7c2c1c290..5c71a2f65c7bd93f6f516a54f7e63244466fad47 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -1073,6 +1073,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 Fri Apr 11 09:00: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: 880407 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 19BE229B22C; Fri, 11 Apr 2025 09:01:58 +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=1744362119; cv=none; b=d2TPx1IESbo84YK+uP3m2SQSPP7e7/oBJXDSBWtlvVXAYqOsMl7wGhAFfahAGFtX04wcoSbTxsXyIUq2yX3UqmpgqHk1Yip7LabdGEnjZUe7zuvhdFwy98CNLlOrM+oXslU6tdMZ7a7r2MBoS31uBarwFiZ5vzEI0oNAW3QKQzM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362119; c=relaxed/simple; bh=eueIMfuhJ+J1yj2bA5e9rnF4yzqTd/ncjRAHWOjdMl8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b56y+ZLhAXXz3ggD+AzdUkCGAZgVkNFE4zw4/09uFHO9T8yk+kiM1mUqY8CFyYXfL2uqlYXIGqrDcmVAY5iKj3FGxjrSARSOfUJXBJ3t/2GRVBcRqwwtoIRKQqhobpCxlykMnbaxftnsej/018j7qXyIBJqsjGJGOnx54E6AMpc= 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=MRVwZCMZ; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Q0hHE5eQ; 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="MRVwZCMZ"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Q0hHE5eQ" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362116; 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=tz+K3JzFCxIC1WzEuZHw4kf96d8I8QM3F1CQ6V2mVsY=; b=MRVwZCMZfLjjaOrOvHe6aIXV3Ca8uHVAvXBvKrUUZIX8Lb6U9croCVzsD2AdG6TB8DzMW3 Wu5J9GvlLPFJoZm2zY3JBy9XD1z0kBB6wOg+Rgl4FEJVpUl1vxXs5RqDnf4t0OHsdOH4bk RURjnhk6alrodPHDaWZXzASxKrMkc+YcD5UIACb0/8dEYB/+vwJg0cTV+1ImS4R1niPDkQ 5MCg83mW3KpY3eK5woMm30fHuK/n8K86HyGeIJCtSuYXVY/cYPUUsJTT5s1/gdgqrFEXBv 83ybLF2HhX5OWKEnBJEVp3y7gyFfS7Q/clTFY4HBh31jEkB4L3+Iv66OQnPUzg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362116; 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=tz+K3JzFCxIC1WzEuZHw4kf96d8I8QM3F1CQ6V2mVsY=; b=Q0hHE5eQdYQlZua1CGlMC0EL01V1RcDHSBWCxPBMLgKbYJ1pYmRXpuww2xW7JIjyXY0FS2 ohGZcMA7VhdRySBQ== Date: Fri, 11 Apr 2025 11:00:45 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-21-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=2732; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=eueIMfuhJ+J1yj2bA5e9rnF4yzqTd/ncjRAHWOjdMl8=; b=irK2AN8RJ3zBH44AteK3nrFBiTnIMePIEw45lccoT3Fmv4Rhak7TpMb/gXm9m8fz7CoNPSVbJ iRScBbtzHlTA9gUkK//Vp61ykkG4bylt6UheEoKqOh0LAxNA5vEPTVL 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 Acked-by: Willy Tarreau --- tools/include/nolibc/sys.h | 71 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 12 deletions(-) diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h index 5c71a2f65c7bd93f6f516a54f7e63244466fad47..e39eefb2b82cc97eccfc030005fe0321632f12c4 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -1267,6 +1267,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)) @@ -1291,18 +1292,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) { @@ -1316,6 +1305,64 @@ 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 == INT_MIN) { + SET_ERRNO(ESRCH); + return -1; + } else 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 Fri Apr 11 09:00: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: 880673 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 7DFE829DB73; Fri, 11 Apr 2025 09:01:58 +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=1744362120; cv=none; b=Nq7avR/rDQl+VxhEChhUIBlYoUclTmZEtEceqNzXkL2CwkzAR5ZzMuS1eGplKewrK5Tw4QC6FcRSWGoeNHBbQ4Y1E8v2FS4bjDrCKN8LkE3mFVN4cvWs63nsf7ou4ALK+cFeooNlu7OBz92TjqOVJO9UDQW3TAfrWHuDpQ/whZY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362120; c=relaxed/simple; bh=q4kd7mGGuPTJdyPDCjQYjszzTh6pp6UOGPR7zUxPBBs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QQhsZ05JH/LIdtRBCcj9hSZ+xOlbFi2jjc45wMuNC+I4PzoZ+/NrF8+Ci+uT+vKe0gbgR0MiPM0blz9Bsgh9JSI1NR2OYBjexOY+M5ifxo+QMUTIcvD4EEfDUvVN9MSSzkbokqmt/YTmsUgtCJoFV4/51ApAA2ucjCHLChV1+fM= 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=cmCpPFPY; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=DDK92w6P; 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="cmCpPFPY"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="DDK92w6P" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362117; 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=AqLj2uDZACTDisGAnX7h0mSVa8/8RdDY0n+eZ6yxnAE=; b=cmCpPFPY77n1JQGOCKiJIKbBGI5+vT8JwZOT5nF0noHy+dBsFuw7JS7wGt6m93jd4DfA3C ntWFRPvoM0A7btAeQJGsD3cd7T7KGZduxKwYnCTYWsC2475WGLgcjJTvN1pu2YFQCQqRgD WzBq6puk9Pv7l7AJvmc7I23WVfODl0be9rJMhpWwbzVcuApkUQkf3AdHyz53sImHXRYWR/ x/AUwd5uS8jflUxW6+ZwFNMBMxymQCxw1oYmldL9wKVrcNb/DawfSpQ1++kzIbOzfUOrTn /xUwzK+6d2v77mg90kCtgjoKRHmE7CFFyLU8wsE26MPV9YwfFG+iW5Z/JuHR+g== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362117; 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=AqLj2uDZACTDisGAnX7h0mSVa8/8RdDY0n+eZ6yxnAE=; b=DDK92w6Prl/kp8ESUX+G8v4mHKOM4lZQOKOAn501V5noJYv4NaEga4/dYXydnzqgt7+Tz1 9QQpyr8DvmYkSbAg== Date: Fri, 11 Apr 2025 11:00:46 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-22-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1651; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=q4kd7mGGuPTJdyPDCjQYjszzTh6pp6UOGPR7zUxPBBs=; b=aJJNm82uWTw4C1wejU5ZKmg4K3b7O49aBmJY1+zCTBFAZLNIRZyiGEIfHJshek826DN5+GzNf QBxF01xxw/JBVYNpPG8wCTgYm0tx0pA+79f6kcn1rQaa0+SeHlYx3A0 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 Acked-by: Willy Tarreau --- 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 70d418b87f7731572b85d64a8128c62d01df6b2b..b4b9a8422d76e1170ff967850429916a2190139b 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1462,8 +1462,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 "); @@ -1501,11 +1500,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 Fri Apr 11 09:00: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: 880406 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 C75572BD5A6; Fri, 11 Apr 2025 09:01:59 +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=1744362121; cv=none; b=IkHbXlEO1F5ur/t90AN/lKVNLiFiZUmezNlua2jFKO3KqwZvCVL2Ew6Q60AryEA/mHDSZhxXF6nHaLjTqAusFu5Oe3fQwormbisnDIzfQjiyXpj4fejs1NERznmXEtWMvjONPxfWr/ZrTqjQS7zG5+ovYJppcnUNuJ0pbrkv2S8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362121; c=relaxed/simple; bh=orWxm+0HgDh0luacmmPqHBYqPsziQRKvdvp7XdrcWAY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UliXl1iHo3uQjutGAgzNEXtZYiUSrL4p24MaIwqAUVLTb1zY3AOfYzr5JlBjemt4badzqvz8xcU1KTPfewP4ldffVqENdLvdGVfUOlfTMIrfR7SuZMEm8/BSHbWvR4DGTZuSvyGCVJjRCVFmGhJ+JMeHPhDDm7rAuNTh84r+H/Y= 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=RHebHj+T; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=m4hgC8vt; 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="RHebHj+T"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="m4hgC8vt" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362117; 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=zxPxFvYnts74EjizYrncbr+uFIPm2JowqVuGA565ZYE=; b=RHebHj+TS5jQwonBzS0LvlndpECqRYQ3DDS44F/N6kPme5HJWMW/P3+LLkaf01Qoda/5jx fE88mxeEbRJQJ4VJi0s29Ev8ILfbS3+Pp0d/+joytDKLPK+o/E3vFWhc40omIgEuFIl1bU DarbkzPiV9lj+9RfR0jAyE33yKY6S+g4X56kjW+d81lmMLmN/NvgJLd+dozDZLb7BP5TP6 Ei21yQldA4HjjtUaBqvGUwyyO3zd3K90jo3IyqXMsjHjUwBO/7i/eOvx78TrFo4Be8aX5g K7eeXAHVmgnAtZt57baHXrzXuDaeIW6O1NDoyYyZ6iGwdKNZVVMdgwZFEtmeqQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362117; 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=zxPxFvYnts74EjizYrncbr+uFIPm2JowqVuGA565ZYE=; b=m4hgC8vtGtTnEKaIX5ic4MnD9+YgzAaD/mRY2lLCRqQM5CWw7XyOrO9h7OJ5OIDE4VNlpR PHUsv94TKLlSDfBw== Date: Fri, 11 Apr 2025 11:00:47 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-23-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1389; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=orWxm+0HgDh0luacmmPqHBYqPsziQRKvdvp7XdrcWAY=; b=I+JkNvjvxstCdZam6IZGTOLheZRXF+73nF88w5y9S34dXwZrRkYNtCHLZab4QQ4rHu9Y7aoly dfZWJ1v55feBDCM1ytDFXP41/k1dCxbNcqX276MpIORrvod4WYxDKCR 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 Acked-by: Willy Tarreau --- 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 Fri Apr 11 09:00: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: 880670 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 9117B2BE7BC; Fri, 11 Apr 2025 09:02:00 +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=1744362124; cv=none; b=ZCoRFedez/ttB5Mh+qMQdokm2BckKw9nwcmPWw0IHarDyZll9Uem8tIjvA/oCFIF1K1qLOXbTajU+e5ZYDHyrLo8LClb5Ix3TMs/0P3szckTDL1L2fWMVpg4QzLcQO2s19fO8T7vOTGX3VHziaUUqbGpbEGZ0oTH3rxf+gnEDco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362124; c=relaxed/simple; bh=tt5NS4cBLTbNoJ7EV6vHy54O54vj6AeymCsD10sDXy0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DVjCJxxeHDQknj7a1Lb/fv8BeQMKmR8bp9d6bThyA6LTHa0CGQQsUVn3arTtPTbubLLQXhfEPXUVij0rc9qtgEEMhldo/SY+04bOLU6Ja7KIyRoJNBFz96rnhAfc+b86i96I0bFc7K0K8qZQzjBjMwERmURv/9jLYHkceqTJZUY= 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=SpZA0qVs; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=0ABqpDU1; 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="SpZA0qVs"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="0ABqpDU1" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362118; 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=2u19rqjC1rYwxFvMglNkhCFpgxOoiJO9w3f9eDb1mvo=; b=SpZA0qVsVc+tdC57aUP6H2OR8ANOC7BHiiDNeX1Tl5Da78Z9XuwPe6eN3LLJgQ0hV5zxem wwCUvSF4AzbNXPf3Mo4bLFQYDwPLv/vvJjpMO+aT4GfLCYYXxorUFSUSLyj06OK8WZwBo1 ri49tgHMSQum1Crf+x3JKB8y5g8r+yM8Onjw6/FqNleDCQ5sH4qFfb4a3u8RVkG/i7ZH3W 6uiqL9UVLylC5wnXY49FScWLBS1CnyvlAOVP8yOqZxgm5awrv6zYg7k1RL0KJx37V7TgoH dI12dbZvxyJ6ZFAjDhF0ZDkTBuno08bW7Z463GXSiJRYHfb8nIUttV0C3WF/vw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362118; 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=2u19rqjC1rYwxFvMglNkhCFpgxOoiJO9w3f9eDb1mvo=; b=0ABqpDU1nWxKU3Y5Nyv6sHApGMqyVJm+vTMBVDed7vwRNn4j749cZXG815kjg7dW6jDRuQ b/UjGzR6nriQ7LBg== Date: Fri, 11 Apr 2025 11:00:48 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-24-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=3808; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=tt5NS4cBLTbNoJ7EV6vHy54O54vj6AeymCsD10sDXy0=; b=HlntrhUVmalTrQtpJvqbO/+caW9Rxayx10g7RW6+Mxvd/P4xg69pgmub2g/PXSR4cVG92qWji yoNOTCn41P4D0bdV8Vdh/YWj3bsknWqInyy22V1mCqB9txwlBcwgRX4 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 Acked-by: Willy Tarreau --- tools/include/nolibc/Makefile | 1 + tools/include/nolibc/getopt.h | 101 ++++++++++++++++++++++++++++++++++++++++++ tools/include/nolibc/nolibc.h | 1 + 3 files changed, 103 insertions(+) diff --git a/tools/include/nolibc/Makefile b/tools/include/nolibc/Makefile index f9702877ac21ab5ad30df1740e40e67f477f3824..e47e1607bab82f1d91effc025c9257e8a451f047 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 \ limits.h \ nolibc.h \ signal.h \ diff --git a/tools/include/nolibc/getopt.h b/tools/include/nolibc/getopt.h new file mode 100644 index 0000000000000000000000000000000000000000..5fd06c9702e96e8c58a6b242f535bca09db69343 --- /dev/null +++ b/tools/include/nolibc/getopt.h @@ -0,0 +1,101 @@ +/* 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, opterr = 1, optopt; + +static __attribute__((unused)) +int getopt(int argc, char * const argv[], const char *optstring) +{ + static int __optpos; + 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 70872401aca8d5aa37b12ee585193353f692576d..187490535d1359aff371e2981118e62bcc0c6948 100644 --- a/tools/include/nolibc/nolibc.h +++ b/tools/include/nolibc/nolibc.h @@ -105,6 +105,7 @@ #include "time.h" #include "stackprotector.h" #include "dirent.h" +#include "getopt.h" /* Used by programs to avoid std includes */ #define NOLIBC From patchwork Fri Apr 11 09:00: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: 880672 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 B984229AAFE; Fri, 11 Apr 2025 09:02:00 +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=1744362122; cv=none; b=cf9PRVRMgdL/FdD2o1YtT5WKUQp/PqSE8fQBhdvZAk6F2pqLmCGTXrAe/HjCObc2OvpLxrVd29XKYe7QFR3DUVrFSKTNlaRajZBN510sMXkdk0l6M35zdG0RjVinD9HMk1oPtld1v6ZIJBW9vJ3AJLpm24+emqULJvL8x2Yv3XU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362122; c=relaxed/simple; bh=P5LbQi17NAkuvW7XclFYFaQVXn+26pugbIFKqyTCxcY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KieHH4rWMpNfvpd1bkcT510CyAD/OvhzYE+WfYlcaWw8h+ETBYnhycZX1/lriT9czprnMMoTxaBp+FQl50o4CAeAJAIRKNapMJIpOe2BIM1uKfHxvfNkLW3C8VGtXhz85An78aU3ws0CNFdNYvT/u7Gz4It11yTBfUnQdkm131E= 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=2eXvzZUl; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=aNRCmvA9; 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="2eXvzZUl"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="aNRCmvA9" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362119; 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=2c+JQsB+d6lrmsGdRgSEPuvJuQzEcudvCh2/xlKMBJo=; b=2eXvzZUlecNijtcEzXBQfARUaU9rsYNu0d5QGmA+abbjpnYrXhp2tbRGiAoeH2+Dd0vzpX sVnNtvHybArh+9r9uLUd11hzSvzJ4Wa7+zKVtXU0RWczrwU25bHGHnu/2xPdmtrqtMmrvL 2Y9bqxGkROrbBpbWDUur4+0fVuV1bUwWLhJt22w+MdlU3PSxtb2eAu0dGCHx8de4IE9NFM GLewyKnYN67+EJ0KkJZz/REWwN1aA1xv5b7e7qgHVXr0kYKdX39mcOdxHcBgIrSes9ICHs F3IGA3RpGfKrLiZmXYtetY8fHMTef9x13wWMoZz0ZZrDcqONG6oPh3y+R4zM/w== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362119; 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=2c+JQsB+d6lrmsGdRgSEPuvJuQzEcudvCh2/xlKMBJo=; b=aNRCmvA9TM189Q/Aj82AUMKVL3VNaq10JQbe6JnlE/gBrezEP5YTxeAlcEa1PbSIbMWWyR pN9b2fpvzFJErRDg== Date: Fri, 11 Apr 2025 11:00:49 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-25-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=2074; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=P5LbQi17NAkuvW7XclFYFaQVXn+26pugbIFKqyTCxcY=; b=NoiWYraaCzekOYaUanULW6h0LSwm1ZPQqwfmsQsIoWe0/QpUPKwRqD6bkGe4E8Xx4DdV+Bsf6 PMYpMkCIuvsDX8CUK2Ev5LJXhP9f8UyL/Bkp9U7fqtaQne9WUYmWl0H 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 Acked-by: Willy Tarreau --- 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..5c893b4903a3040a366e11b600ccde30913d7db2 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 (*__nolibc_printf_cb)(intptr_t state, const char *buf, size_t size); + +static __attribute__((unused, format(printf, 3, 0))) +int __nolibc_printf(__nolibc_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 __nolibc_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 __nolibc_printf(__nolibc_fprintf_cb, (intptr_t)stream, fmt, args); +} + static __attribute__((unused, format(printf, 1, 0))) int vprintf(const char *fmt, va_list args) { From patchwork Fri Apr 11 09:00: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: 880405 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 3E42D2BEC27; Fri, 11 Apr 2025 09:02:01 +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=1744362123; cv=none; b=kcUn32wWsDjzzS2bo/ZumwkAkHBTmtp2xyxDkYr74UcwYxaAs9LIXy0PnErbdgrzvN89dJFE+tMSE5gMG9mx9CpCxHiUfi0RKiT5wJOXQ7rT56r5md8kXr4fREe36mAG2mackZZpG+YArpvGGKSIMPqe6+BXMrI0iHe5iqNVaOI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362123; c=relaxed/simple; bh=HtVJce/zltJfmoUxHSGByH8pfwgO3OfNF4RtzIB7sOk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ecKAn4fPfWTWjgM39EHQQDdPQc0UlkZLQECpA7N//H5BSOn9cUNSDCFbB0KkpA6jZuH2VN4mF7CUWZ41Mnqe1b6AI6vnSV2l3Xn4dS35JZN7VO94e7Mwv3L1lorRDhOg9TZj/1QXZ2Z1X2NGip6jn5/8zLAXtfP8ODsWnA9JjqU= 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=HxclRMsm; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=T2JSuJfq; 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="HxclRMsm"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="T2JSuJfq" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362119; 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=pvBGqGX78XvKEVW6i13ta4x/bQjOWTVre+e55nvMR/A=; b=HxclRMsmdO2PwC6Ss8eIbcBNKZveR3YAh+oPIaFiMYcWi62VLqjF2OmXltBhWvj0wjhx0h HKmIvWPaGBDJXkSemzlnZGF6xV9TDbMf1unbFxCNQNicYk8EV+8bz6FSDLf/3EI8hplnS5 U2CDGbA9EH4Vr+0bYkLGfPTRLnx2UzALjVD0ftw0AlrdntGnW7OO6/Pj48UWDcqadHOH8n wdwW3+zYsESVuX7+6bnBp0NntuheYwtN9995LUwBgtbt1OffPknp/npOruDfCOHqRbdocg Gc2BdzTiiFv8ILTcRntnB9FSRqves7RASb1exsWcIK+70IPayfA87GDTdvv1Dg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362119; 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=pvBGqGX78XvKEVW6i13ta4x/bQjOWTVre+e55nvMR/A=; b=T2JSuJfqPkOs+Eob1PFvZJb1Zjk0iIOF+xWnZB4i8lu9zhaRXdHyWqGmtU5qemplA2UTQ8 eOmPl3SmzoA2n6CA== Date: Fri, 11 Apr 2025 11:00:50 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-26-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=2100; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=HtVJce/zltJfmoUxHSGByH8pfwgO3OfNF4RtzIB7sOk=; b=X++XRbGT3Ihlo34Xl+EkOikRbEDLjhE3kwPUwM9/2x+3aLY7KpDjwJ5Z3c44OIw1MFJrfZDrs nDdl9F38r2dC44Yz/EFNwr2vcoZ56JWZIgBNeOSxdNIWELVavuh+VNY 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 Acked-by: Willy Tarreau --- 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 5c893b4903a3040a366e11b600ccde30913d7db2..b17b473bd8751a6283309178b4848e61e1683305 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 (*__nolibc_printf_cb)(intptr_t state, const char *buf, size_t size); -static __attribute__((unused, format(printf, 3, 0))) -int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, const char *fmt, va_list args) +static __attribute__((unused, format(printf, 4, 0))) +int __nolibc_printf(__nolibc_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 __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, const char *fmt, va_l 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 __nolibc_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 __nolibc_printf(__nolibc_fprintf_cb, (intptr_t)stream, fmt, args); + return __nolibc_printf(__nolibc_fprintf_cb, (intptr_t)stream, SIZE_MAX, fmt, args); } static __attribute__((unused, format(printf, 1, 0))) From patchwork Fri Apr 11 09:00: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: 880671 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 3A59F2BEC5B; Fri, 11 Apr 2025 09:02:01 +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=1744362123; cv=none; b=pxNW8teBnQsOIN9FsM5MRy05yOeLQk9zIL1wi0hc56O+XR1YrgSs+E/qbBrePjHMnGkHA4oMAWhYEdbro5Lh3NZyOIAXIWms9lpJk9ViIDlXSGxQB3LMIgNOUJiCbV21aWrJySNo+u48mOxJ46XkZ5WeqONpC/96hQAhBATtiNo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362123; c=relaxed/simple; bh=kr1493r0mCxh9Smwnzq2sT4EOgraIN/H6Zk+RSFwpBw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r5Y6mCMD6aYWZaUwR5xs74feUOIw52UKQtRPQTaQYNdfzRoweTciaR8gQRJl+AsiWhQ0L+MUf3zKlm+Ks0f3mE+ZSN+UOoRXUmgzygTV9lVEJiuQSWIbmFfit2yWD8gdhKpDm7ZpUDKrq9iJ6wRFLbYIXa5gR/SFpLy3h4nynuA= 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=lswV6A3G; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=FNn4vut7; 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="lswV6A3G"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="FNn4vut7" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362120; 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=R9tNYn1A7xCJCEfyuN7DqxsUEM5cT1Wf6v4wfadNgQw=; b=lswV6A3GDcsTEylftDeg1TLTlyXVNkXIuondQMbGzMR0Q+wZ3VxaW1eFBiPyntDLBCBdkj Pl8eV+ZGu0ch5YnrZDuDoFFjepA+yM9m39dgckGkJLiTAL/3Hk9ddDn6socBJUws5FV7Lu uBvGR+zk3tOTpjkn8FkZVaAKiFTW4YKaeFFyc6EkmQkkViPrkm9GAi9Ya/Cxxp2fkmCmSF 97panHuFYPnktOBjL8EtsFmHERC7q0Dd2mkY4tmOsUzkU8v+n+8B8qOhOs8HjdBC9SSCn6 xwf5dJU4AVq2B4ZQeM4nKgXU3DzgLO85GiWeRV23lZ24IVuvpcIsP5WgH71Zlg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362120; 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=R9tNYn1A7xCJCEfyuN7DqxsUEM5cT1Wf6v4wfadNgQw=; b=FNn4vut7RerQLrH+tkUa0+TzkrO7LXuJ7kBaUjiLUtrLshjQQa74brNSTHZzi4lggUohCs CAGKDNf9317Lq1CQ== Date: Fri, 11 Apr 2025 11:00:51 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-27-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1911; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=kr1493r0mCxh9Smwnzq2sT4EOgraIN/H6Zk+RSFwpBw=; b=ne/2R8RR+l2VhltEDs/txqus/cSPrDcysM8GQZIZcZaIfeWhy8ba6uwOXsxZGhNWg81Pftv3k M94lZlCD0y7C3/YU5lbMkC6g0mUGi/Ok8SkjTB0o+d5Uy2Vnn0n6wYf X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= Add more of the printf() functions. Signed-off-by: Thomas Weißschuh Acked-by: Willy Tarreau --- 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 b17b473bd8751a6283309178b4848e61e1683305..46bd90f96d654fadda20292baddc98358a3afc62 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 __nolibc_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 = __nolibc_printf(__nolibc_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 Fri Apr 11 09:00: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: 880404 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 52EFC29898C; Fri, 11 Apr 2025 09:02:02 +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=1744362123; cv=none; b=UsI0Aibhqhv9a1EjImyVm1iabn6PmnXsXzBUs6sytzpCsTKBZvWYtYRsGukkr2Bx1/V8+OAMWYqbI7MI6w5dXcmJGu69+Sy5emvTgUiqEyrN3aUDS4TH8wyFMM4aPSU2r7jD2N8fl2K34E1eM6vTpSjg2qcCD7SmrbBsdgKURZk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362123; c=relaxed/simple; bh=MN6AkwH7M04l/Z4uzha4BvhmgdSGZ7J563KtStfiHRc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sTDIBjYNqHVqL20bcvZce8ttf5OZWSJkTyLUHKLUOZzJmeBfsRzJbTx1j+0T+Sl7xPwlnZEBBk/3IV6DT3X3HU5D8UQKVVsvxvLp+a4N9ebofL++HpLnVVbwziOSLOfC5My7I3ptfncNox2T/yyWHvlbDOiDGdKeLwht+x2/WlI= 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=L9onRm5S; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=ZGXdUt7c; 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="L9onRm5S"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="ZGXdUt7c" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362121; 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=psPihsV7XI/HoMHLIosI4/jOkhz9urwrehOWAUKYKjE=; b=L9onRm5SlM5ySECoRhgL2N/WAOVR5cDWaHlAE4hfd9YFCoA2Lvmz2CKfTpII/PnP8xt4hp IfmSEMPFFc+nwA4CBwodKu8QabN/glcukBLF+Xbdd4v3UHFucEqdhZKr98dlgNwYD1lGm7 xJeALKflkG2FOx5HS/VZdGc8usuaVYtk4fyNXL6CNNeBIPxP9jLYXpBUHWd/eiajgj5Ice H9FiVWQs/u5zBMCoUsecpIHmgg94+GAgoq6y4Prw0W36ljVMSKVqY6uSejWlWAWr7yig9/ r95NdNubs+o9CrMQ47eN3g8lUYiVILv6Mwavf+iJngC7vBpv7lPXajSs/XjgHw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362121; 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=psPihsV7XI/HoMHLIosI4/jOkhz9urwrehOWAUKYKjE=; b=ZGXdUt7cwIv1ZPvsxoCWuBAQD4RrhefRR6f/vmgMQTQthBV5JcR31nlS5oeXGWukbjBYXw 7ZNWwFxcccYhYyDQ== Date: Fri, 11 Apr 2025 11:00:52 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-28-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1769; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=MN6AkwH7M04l/Z4uzha4BvhmgdSGZ7J563KtStfiHRc=; b=RuUcFra6BR5ZXJUkZDXhyUbd204Y2ZQExG+CqVXcx8m3FNaUnqB+tqHgMvZ5Ia0MtRgG2Y9lR 0gmtrLedk3BCqp+6eb4PkxSpIWlJdGtQgzSJiV+aUTHHGJAafH+Kswr 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 Acked-by: Willy Tarreau --- 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 b4b9a8422d76e1170ff967850429916a2190139b..8fb241af33cbba2ceb1303bf41582d51f70df68e 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1300,27 +1300,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) { @@ -1329,17 +1316,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 Fri Apr 11 09:00: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: 880403 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 C82882C374B; Fri, 11 Apr 2025 09:02:03 +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=1744362125; cv=none; b=NGB7Mk6zzHywGvr0/Q59HhlsGrM0JX3GFZCzW2S+jjrOU4/8sayBTti4mbHL9cm8VQ3nTJpxPFvNcRzucqqaRWF56kcBNKXV9QfDBNhT4qAsfY8lU2hJ/SntymeJJH1cvQZQK+3pMU6x27k1+6iKS8hJeVbYkNkP0e3wi0Ytzg0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362125; c=relaxed/simple; bh=1m4pGrKjarsVyBk2sHbIz0kz1QLrAgcqnYe0JpUbZkA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tuLy6hp0PxGNWt9A1BmAMPr3rOdpjtgqYog0SFMbyKVPBR+WAYhbLnNGzsnSPs1wyXlCpOKqAu3ESPtRfHqN5g1RmpYc0JZKlBWIRhBMZIaESn7x9y2D/+LQiGIhqdYBCxBkU7qUaOyo9xjJZqwtyslsUkjdS1F18ovfWClzjmA= 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=ldSBgIjw; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Y1PGnTso; 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="ldSBgIjw"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Y1PGnTso" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362121; 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=0hGEGPrYAeGEEY4KfXy0LyZoEFXiYSsEkS/Ru5j/+Io=; b=ldSBgIjwZF1hDyVmSXxXOGNusGqJvmcpjAYkWmxwdtZQggMyqdJYWkv9E/rGweUzxy0Aqy /eh0YvcH0maTqkr1ouNVpvBqAwfwKPmQ2oHRQXjyBQFvRV9icl8iSDq2em0+dNtzaL8OUx rC9WK0CFcTrQIBTb4PCtHQNHNc/y4Kbf7Ke905NQgs//QylBlPa90CqXDSsCdeF/KUmd/E 6o4wo+U4X1EQpfuVSF8OLj8NgLXLRSpMCf+KFzr4rEPCa2PwEvdiWxMYBeoVjy2lPbdKP9 tpHJGeP2FS/0ExHpkcgWU60OzYz/G6LflwBNTYHkJivmPOPRxyKY4MyCYJdSYQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362121; 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=0hGEGPrYAeGEEY4KfXy0LyZoEFXiYSsEkS/Ru5j/+Io=; b=Y1PGnTsoBIz9Jms599E42Q4JRfCZmoQEvaw4oRJUWkCCcRPkYEuGqicnGUJSqhjsDT5USy uRzLvg06Q/X4tSDw== Date: Fri, 11 Apr 2025 11:00:53 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-29-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1295; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=1m4pGrKjarsVyBk2sHbIz0kz1QLrAgcqnYe0JpUbZkA=; b=s5jd/oAjod4BGhI5gBOfnk1py9vROPlp4HibskMyz5tLKCuFZuLs4dJ0hbeSd6Hg+Cisf1JcJ 5VW7vg2scG1CVx0fnAcaFuwwUkIUPisOy5q63qH0XDFSpNquRzujfqz 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 Acked-by: Willy Tarreau --- 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 8fb241af33cbba2ceb1303bf41582d51f70df68e..6dfa94df37547dae46ab19195a763fe22b065bab 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1390,7 +1390,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; @@ -1551,7 +1551,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 Fri Apr 11 09:00: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: 880669 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 513062C3766; Fri, 11 Apr 2025 09:02:04 +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=1744362125; cv=none; b=UiROqwrpO4CbG5YpBF15tT8kFnTNZaDCqS1O7fIaXxQPMXYLi7dxZ8XkpIXlC48pN4hR1VoHW1xpivWVsDSmIMA6kY0oHroxySDTQPQCgU4t0VZAY0IxCgu94WJQQyxwXI7dR+PgDtqJ7g1I2PU79c4WQAqXnrKbsSn/Ao9UK8M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362125; c=relaxed/simple; bh=8gx2j4OH7y+ey3+O8eHa4G2jocjuirJqpQ8j8E98oto=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=buLXMBYRBHuN2aYiApy2QBAVSGxcWjGQgWcgR0QduRXtPPjcivPtGRfOEdEwOU7dtV2QzYt3mz8wXZNpBX128Y1v2/iuKNdJsI6GyDdSA3dchPdYs492MYCPnco6kbBdffD/KFbQqLy6tAZN0u9GIghY2jGlhwxmGbGSGm4LvEQ= 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=d+Mnz3H5; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=vDQJRCHY; 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="d+Mnz3H5"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="vDQJRCHY" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362123; 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=tGncphnL/iwYpyKH8kWhkIbaBWNrCOh1asPqEQP8sdM=; b=d+Mnz3H5mWnAz+lXedwf2qFKsa6zZ0dz2H6e4l6kMEMXzY2sswM1yrYpvUvNf09e2JRN/i He5/WyYUS7xOXqbE8erB9YK/jfXwmtewLf9ib3dvhsPveSWsgWR9SZPlngRddteBVIDZVL kEsmTYeDeQpcXpwmSkV29QhliezXEFYjMP4MZKIGt2TR8LIpADKlokifqytqadJDF3tp5V bcVq9dM5Ni5nVqxIfpjPQ0AE0+APfO2zxD+ZXJJsibvYI2e8nSPjxNocAayMiz2Uu9umqk Fgo8rG++IhK5/Ro95Jaob9Txt/0320kGa2R8VClDcUmmXfMIE2OwNIcsZHo09w== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362123; 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=tGncphnL/iwYpyKH8kWhkIbaBWNrCOh1asPqEQP8sdM=; b=vDQJRCHY3ADikZq0+Nlg137YaXR9Uu1NFR2qwMO/e0DIqarmwBob8D0j2Closf/nw7GSfE 0WJ1UPoMZUeqlsDw== Date: Fri, 11 Apr 2025 11:00:54 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-30-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=1552; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=8gx2j4OH7y+ey3+O8eHa4G2jocjuirJqpQ8j8E98oto=; b=W4PT4hcs+ounZRtN8/fdcsRsqxiBBR+4Sd7+Hdn9BFHblOajV5LCF8VHl0Fl/a5vLr2kMSOCd F9dkI34IkBDBQvq7aAOK4EWBIeic6rocoZnDvwl0Lh3Th5nZaFNs0qJ 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 Acked-by: Willy Tarreau --- 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 6dfa94df37547dae46ab19195a763fe22b065bab..9bd0a9c68b903cbd660ff81d4b0386b0b7c13977 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1307,7 +1307,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) { @@ -1413,6 +1414,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 Fri Apr 11 09:00: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: 880402 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 3AA442D1F47; Fri, 11 Apr 2025 09:02:04 +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=1744362127; cv=none; b=VncrrYvG91TC8KnWM23fSmtbqzO7Qc73y06QYkjtIHBmbk0ipw9SUOXe7G11lupsykcQKYJ6PmIe8vXWeYWcyhMqgDbGN+kXrxwfW7mewLUq9xk8HwrM3J6sLYDjVl+Ok4urCK1aCXGKoeGf8BngpJSk8BsuFitiMf9VpzA27CM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362127; c=relaxed/simple; bh=4PWMuyjdFGi/rGm+eh3+GEBgJVFiFZN51q5MAPLIuoQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VkRdPj/pO3vanScfqxhS0H+g4u9MYh+jJjsroDVpyvxhtDcxvFE7qdQ5VQwklAZi1/b7JV478DuvRNz6sLsXF6/TgTgkAI97HfkD4G8GkyZ36tmdB4Mks0u6/GaIrvBihVc1UPbNVSbhir5QNhhVk8prrPDjw31Ozmb2pMgTuyA= 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=UM8acNMw; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=IICcBQqn; 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="UM8acNMw"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="IICcBQqn" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362123; 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=WupVzBzhpR9wEE1wxtcIpqdyGm1uGqU4Sj1sAih5bIM=; b=UM8acNMwlbNtilAsoJBq3NNM2v5cPLGJq0pzkbH1McBkXfh5nrZOEU4RPJQaSk0fm/Sr4a E+x6AXK20VzMbgEHZKPQ/1ZwWXzJtqwVIhgFjpzKOLUPr0PU6ZYxUDNJWrNq1HyhiXQFV4 jLxKdSZS3g4Fflk5FYfRpFif1sPo8+cbFPsHTceYhU80H4QVU2dkGxa0DXaPUsHehRCDL/ QxUujNGtdvSmGaJwFCmfxLfE/9wntJqLkNYtUDibJ8sUKl/Ucgqfn3jQnkfTEzy3utfrBT Pf1uXvME30V5gnDpaCnRwblL1EVstB5bW5jbEPqBcI97Rzz3mA24WgeRq90X5A== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362123; 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=WupVzBzhpR9wEE1wxtcIpqdyGm1uGqU4Sj1sAih5bIM=; b=IICcBQqnXLEJSOd4B3tzfGRBH2GVLFFL9B+7gRP+bwd5jRQweCZ/a28dW5wr3xU38n8Pyu 2CdoY8v99782bJDw== Date: Fri, 11 Apr 2025 11:00:55 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-31-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=2908; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=4PWMuyjdFGi/rGm+eh3+GEBgJVFiFZN51q5MAPLIuoQ=; b=UkxEY9GedZRL5ANsdnHTP2map3v1Ep3TNo6I+jZuB/S7IBb1ORcYjXiMtEK1NsLeGb9iaZXfm qgi1IdJCe8PA5nQEYjaD2/hbl7ciWG1/Ik0/FksDYTx3Da4evKPC7Gj 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 Acked-by: Willy Tarreau --- 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 46bd90f96d654fadda20292baddc98358a3afc62..fb0417477759ee6c9663e84807c1d1067e735dec 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -220,7 +220,7 @@ int __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char { 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 __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char 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 __nolibc_printf(__nolibc_printf_cb cb, intptr_t state, size_t n, const char 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 9bd0a9c68b903cbd660ff81d4b0386b0b7c13977..16ec4f658bbec43440679c5d5c35014827c377bc 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1415,6 +1415,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 Fri Apr 11 09:00: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: 880668 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 5F3BA2D1F4D; Fri, 11 Apr 2025 09:02:05 +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=1744362129; cv=none; b=UTi16EzvPpwjPkaPcO3AQ609F7E8IsA++XoJ4gpvE/cW8IWnl6ECtCCyQsuYVgr008BcW7C9HxPZrc+3l3IHOUWb5QJbRjOiTYRbmr6m4krk1l693vdzF0d9tI6AIqmx5O9BL9ngc5Z4SmZe3GUW4VpXP0dV67BcUy0//pt12Q4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744362129; c=relaxed/simple; bh=ss2KMgUFNqhfq1OuvI6El5UWRFokLVh/tQ+JNK3PyVw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RJwrSTUpdEaetoj7sFn973YcrW01lVgMoJK0u5C41QadUfEEFiJuQCKudF8qRbTZEkL5AkkWAJ/a+kW3rJ6Ph8rw7hDJO53NTQjzTKqtrmURNpO3i6BQHNwoXRbB2BYkNJoTakpqCsIQKpS333Gbe9QAscxePl76EVx2miO4mlk= 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=k173Gka2; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=L7rhnAgZ; 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="k173Gka2"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="L7rhnAgZ" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1744362124; 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=mHsbRQR9aGca+asR+K4zcB2kzkD2c8USsaI2Fla3H24=; b=k173Gka2T4B/jENJWK0LFvmX82eP0BY6Z4ayIb74LW8Ps6EhxL2iCNChFlVc2aXawV9eZo 2J93W3D3ahOR3Wj/9Motg0x5pxoGD58Tvz27z6CE/6yb7dk2ebiUmT9gwlLXV1k9QtxYbh DbWpYok3IsxkgDtN0SJPiIYKmKBSBjD+L/NOcc31wF/qV603Xan4ooCWGh5FyD7vdjsbQ5 YP1Wuvdq7Xqk/ZNEiUtCqAE/R9vnTC4iY4Ir4YOSDM5XIEgD0gGg2tuxvhgOIqORV/IhZ+ Mu0kVGZDI5OXPnWCfgqZXYQmWn4im6sXwO1RHMxpenwQRtP3yuy9M83RnT9KAQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1744362124; 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=mHsbRQR9aGca+asR+K4zcB2kzkD2c8USsaI2Fla3H24=; b=L7rhnAgZ2XpIRriw8XMfAeF25+7KheHhQ4Khn+OQVQ0Si5ZTgFi+FOECz1LzKYPC5Dlhsg vpfhtzgxq/sRpvDQ== Date: Fri, 11 Apr 2025 11:00:56 +0200 Subject: [PATCH v3 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: <20250411-nolibc-kselftest-harness-v3-32-4d9c0295893f@linutronix.de> References: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> In-Reply-To: <20250411-nolibc-kselftest-harness-v3-0-4d9c0295893f@linutronix.de> To: Shuah Khan , Shuah Khan , Willy Tarreau , =?utf-8?q?Thomas_Wei=C3=9Fschuh?= , Kees Cook Cc: Andy Lutomirski , Will Drewry , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, =?utf-8?q?T?= =?utf-8?q?homas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1744362103; l=61311; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=ss2KMgUFNqhfq1OuvI6El5UWRFokLVh/tQ+JNK3PyVw=; b=1+Kr6xR1943S+0+uKd9VatnAjVEHGjEWycAGMLxLH/1kp66qheWs9NnYuFGrWdz2X0YP6CgUo 4bB7BD51jjdAeJEGQ5z2CzM+zQaEzxZRJEc+KS9SRb3bIY0OuXe5ljW 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. To use it: $ cd tools/testing/selftests/nolibc/ $ ./run-tests -m user In the future nolibc-test can use the harness for itself. Not-Signed-off-by: Thomas Weißschuh --- .../selftests/kselftest_harness/harness-selftest.c | 2 +- tools/testing/selftests/nolibc/Makefile | 13 +- tools/testing/selftests/nolibc/harness-selftest.c | 1 + tools/testing/selftests/nolibc/nolibc-test.c | 1715 +------------------- tools/testing/selftests/nolibc/run-tests.sh | 2 +- 5 files changed, 11 insertions(+), 1722 deletions(-) diff --git a/tools/testing/selftests/kselftest_harness/harness-selftest.c b/tools/testing/selftests/kselftest_harness/harness-selftest.c index 8d39e7a0b99c41a5d33edfe2dbf875cac04c098d..bbb2fda7042ca8bac608625e6f4302466b23f7b3 100644 --- a/tools/testing/selftests/kselftest_harness/harness-selftest.c +++ b/tools/testing/selftests/kselftest_harness/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..7996237ef505cdb4e83be8fbb7d1411f31349b0c 100644 --- a/tools/testing/selftests/nolibc/Makefile +++ b/tools/testing/selftests/nolibc/Makefile @@ -165,8 +165,8 @@ Q=@ endif CFLAGS_i386 = $(call cc-option,-m32) -CFLAGS_arm = -marm -CFLAGS_armthumb = -mthumb -march=armv6t2 +CFLAGS_arm = -marm -march=armv7-a +CFLAGS_armthumb = -mthumb -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 +175,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 +195,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/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..a086839bc322efb070b8f03363ef2874d9f44c17 --- /dev/null +++ b/tools/testing/selftests/nolibc/harness-selftest.c @@ -0,0 +1 @@ +../kselftest_harness/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 16ec4f658bbec43440679c5d5c35014827c377bc..9a074d2b24c99d86bf27f8399f2e7dc719dbcd24 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1,1716 +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 << 0; -} - -__attribute__((constructor)) -static void constructor2(int argc, char **argv, char **envp) -{ - if (argc && argv && envp) - constructor_test_value |= 1 << 1; -} - -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, 0x3); break; - CASE_TEST(linkage_errno); EXPECT_PTREQ(1, linkage_test_errno_addr(), &errno); break; - CASE_TEST(linkage_constr); EXPECT_EQ(1, linkage_test_constructor_test_value, 0x3); 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; -} - -int test_openat(void) -{ - int dev, null; - - dev = openat(AT_FDCWD, "/dev", O_DIRECTORY); - if (dev < 0) - return -1; - - null = openat(dev, "null", O_RDONLY); - close(dev); - if (null < 0) - return -1; - - close(null); - 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", O_RDONLY), -1); if (tmp != -1) close(tmp); break; - CASE_TEST(open_blah); EXPECT_SYSER(1, tmp = open("/proc/self/blah", O_RDONLY), -1, ENOENT); if (tmp != -1) close(tmp); break; - CASE_TEST(openat_dir); EXPECT_SYSZR(1, test_openat()); 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