From patchwork Mon Feb 3 09:05:17 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: 13957106 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4B98C02196 for ; Mon, 3 Feb 2025 09:05:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 654BC280007; Mon, 3 Feb 2025 04:05:56 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 5B20C280002; Mon, 3 Feb 2025 04:05:56 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 40558280007; Mon, 3 Feb 2025 04:05:56 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 1CEDD280002 for ; Mon, 3 Feb 2025 04:05:56 -0500 (EST) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id D45F312258E for ; Mon, 3 Feb 2025 09:05:29 +0000 (UTC) X-FDA: 83078049978.01.F30E749 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by imf22.hostedemail.com (Postfix) with ESMTP id E3A4EC0007 for ; Mon, 3 Feb 2025 09:05:27 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=linutronix.de header.s=2020 header.b=tu8Hh9hb; dkim=pass header.d=linutronix.de header.s=2020e header.b=M1mKAq5B; spf=pass (imf22.hostedemail.com: domain of t-8ch@linutronix.de designates 193.142.43.55 as permitted sender) smtp.mailfrom=t-8ch@linutronix.de; dmarc=pass (policy=none) header.from=linutronix.de ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738573528; h=from:from:sender: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:dkim-signature; bh=wWWpuwHkmHsBX34pcGl1jvCG52qLLh0La3Bmm84Eboo=; b=hkkLKmlJkZ0SSKj4f5YoKEb+xd8Ljtdwmbmsr4xET/aLLFPzsWKbjUKHHbrsLHvbHDqhsR 3c4/IkENhE0cenPQYRYZy+WVqRbEldU9OB+wi35q1fn9XnAYmIfylnG6MvK7Zwvv7Gg516 1G0ZpXW8VOJOybfoQI3sT6mXSuTlBP4= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=linutronix.de header.s=2020 header.b=tu8Hh9hb; dkim=pass header.d=linutronix.de header.s=2020e header.b=M1mKAq5B; spf=pass (imf22.hostedemail.com: domain of t-8ch@linutronix.de designates 193.142.43.55 as permitted sender) smtp.mailfrom=t-8ch@linutronix.de; dmarc=pass (policy=none) header.from=linutronix.de ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738573528; a=rsa-sha256; cv=none; b=LLR7qP8cvcZYT2IBHQUlmn8MRHh6apPNYYfG4nWsuGsqGpkb/PZ9PopMyd48o01J1yIlMV SsupE/3A2n2LnAmSN/Y8kPMj6l47uFCwJ5/GqKujfIyCCImEhvoUxyCW2Y+upxTP5bBwJP WM81E4eZgQWBK/4D7OQFYZTYaLkOR5U= From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1738573526; 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=wWWpuwHkmHsBX34pcGl1jvCG52qLLh0La3Bmm84Eboo=; b=tu8Hh9hbsWetkIDgzcpH2nG14ZI8nV2lcq3oKrs+KHbFh8KtE4qTpI38Igq94jhAvFsFQj 3yY9SX6JdKiD8tVe2lUU9LRtsvnnjdn1JhlJXI2mhmuz8+sLGmg738B9CYWqJu3GcKAmBR eAZBHmf/DNUJNQ4HU3P4/HKvBWjUi8TdvgzhWp8BgOqw/UWfqmIFX4Ii8DQWyiZRkNMGxo XnDY1pvwSsJZetB95mma2AdKtOTPOicddBbhqUJKIL7EuaTezJuUX5Ac44BaK7XUGYnMqr qMdTdJVpXfOXIriZL4wt6wd6AqBXU45ogl118Na0xqoUU0pDPq51ih4XZk2scA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1738573526; 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=wWWpuwHkmHsBX34pcGl1jvCG52qLLh0La3Bmm84Eboo=; b=M1mKAq5BEsyd2vw89rzEqIJlchsRF4h8bG5ZOfxZUaEDBVmgPocf4eab2VMqxI3symVNg2 4ntxneSBMmqJbIAA== Date: Mon, 03 Feb 2025 10:05:17 +0100 Subject: [PATCH 16/16] selftests: vDSO: vdso_standalone_test_x86: Switch to nolibc MIME-Version: 1.0 Message-Id: <20250203-parse_vdso-nolibc-v1-16-9cb6268d77be@linutronix.de> References: <20250203-parse_vdso-nolibc-v1-0-9cb6268d77be@linutronix.de> In-Reply-To: <20250203-parse_vdso-nolibc-v1-0-9cb6268d77be@linutronix.de> To: Kees Cook , Eric Biederman , Shuah Khan , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Andy Lutomirski , Thomas Gleixner , Vincenzo Frascino Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, llvm@lists.linux.dev, =?utf-8?q?Thomas_We?= =?utf-8?q?i=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1738573516; l=6263; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=io6sXt7iIEpqclAN5udDVtDQPsKQqT7YCXVo80AmeIk=; b=GwjI5bSquW7zdPwOw/ObHOwJd3uaE2TURfhr6wXyXJSxHF8582pBDftmeCnGijOcc4+cOJsgI vZbb5XCvvLxC6Hni87Pvz2ilsFxfk0A2G8pgIDBOlJWWLW/J36zx9Uk X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= X-Rspamd-Queue-Id: E3A4EC0007 X-Stat-Signature: r44fj5yog6om4xonxk9c1kqdmgnmewmj X-Rspamd-Server: rspam08 X-Rspam-User: X-HE-Tag: 1738573527-632510 X-HE-Meta: U2FsdGVkX18+f/eUXObUMHgOeWc7IgB2yUaAJgmo1+TRbw9ceIWo2IwtokVRwdnyCX7xqrZxa/c0e1C8PsljUI9RktS8XDyB563/18YLXrQrLKwzjZkKez/1GctDps/2nfpL/J5qiZb0HgOtSXTX9KMQ1TUYLNWVRr9yFuFHBPum6xMRooTiycKRYTMiQH4WuR3QgbTpiiocNyloKWy7jjDLRArYL0yhj9+GRo/gVsZHeCh3Q6M//CJIKtDH0azBjUroYszL+1wByZkQXeJ94vhBuDT0bgoTMaIYkAKz3t8HBJkJBg7Ih69IChSBTObmJ2Dio/MckUVNxS1x69iIv1CgIqPgGbdJfzzDHiasCcvZY7q8sPrWkT177SQ/vV0BxlRXVNGxUCJnVlP0k4T2BSL9aNlsk+soUVWCFsm0fTdqxMhBQRXOXKfTj2jbcipNejXIpa6rR6mKQbXZzKqwr6doN5InuYyM7JqWSjQrTUV1VVUqTOOVqCJTo3JAGATBB20kbCup2jCuse4WLqGTsT78U3HB5ZbKpMB+Kl14owUwramY+5Mzef0W1ffXmHfJQmDKF6ItTl7b7LAjc75UmEJsrVnBJ7GgwXbqIvNJdMdCeN3WF06k44cEWjR9pB+gEA6ln5mauFshAtCy1EKddDfBn9U4cEfkrtiNpYwSXHTLHwzUUk3TesZ4rkrQ7yP2xNQgE43sydVBYmMpNTIVsgiVSE9ZOheHsRCMnszSxdRDBSiAroeZTQMqYlGPmE6o5reFlQTehMruVZopCXS5nz3G1KYp65A1APvruZA+43RmMFZlFhUo7QKk7Cur7hKlIGlQqG68YQnAprMSJ3Ax4CwCaLM6W9d5IhTZ6iYgvY9qG4ebczuWtU02oLNI33h+kZWNickRdfSFRUVrUZ4Pd7xpRBSjxu94II6CWHCIuVWFS9eCKnxqncyF0uZ6gaeNscaEFOrr36UJ2Hdc4Yr GBodvK6X v0lifsiAc4ArzrQ36EQv8cdQR7sZfIRokV9JHs9JwZd94K7Dx5kuT/aaROoOj1LPGZ6ieUfZVy265xkFBdggs+jrUzjyivwZaGPBT/GuaXejeLgtoK/BBW6K9n/EJ54Sf9tf/FkAR7CrSlpQpiYh8lF/UrJUO3bmxjI3cc8vfFm1fZdOe81s2MZ+oMoXm8DtfdL3pYa625CggGTBbOtzS4NEIOzmiWs+X9a2TJrvE6v1uBRuwqsN++VFbUOjaKBbTC2xAVro4LwI3ZYaIUO3M6XLjcLzilRTaWYuR2+orF4RaLa1HqZ0CV5z9IqEemZG9vF9LXk1jpVIpZ7/U68NFVDTE4OQ+MPM1ZplTAW0JbaoOd59/NWZz6TQMGBuIZfkvgvOC+D2U7J8iBvE7rqGM0Fekg0aF50MMqcvy9/Berq4xc99HLYJknc9DRpEq++8hlDwLd46qYKUTmBeFPuSswr/jZeWvhiw5hi5hixpjtY/PdNQ= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: vdso_standalone_test_x86 provides its own ASM syscall wrappers and _start() implementation. The in-tree nolibc library already provides this functionality for multiple architectures. By making use of nolibc, the standalone testcase can be built from the exact same codebase as the non-standalone version. Signed-off-by: Thomas Weißschuh --- tools/testing/selftests/vDSO/Makefile | 8 +- .../selftests/vDSO/vdso_standalone_test_x86.c | 168 +-------------------- 2 files changed, 7 insertions(+), 169 deletions(-) diff --git a/tools/testing/selftests/vDSO/Makefile b/tools/testing/selftests/vDSO/Makefile index bc8ca186fb877dc11740c37f1e07e45e84c2ae92..12a0614b9fd4983deffe5d6a7cfa06ba8d92a516 100644 --- a/tools/testing/selftests/vDSO/Makefile +++ b/tools/testing/selftests/vDSO/Makefile @@ -22,13 +22,17 @@ include ../lib.mk CFLAGS += $(TOOLS_INCLUDES) +CFLAGS_NOLIBC := -nostdlib -nostdinc -ffreestanding -fno-asynchronous-unwind-tables \ + -fno-stack-protector -include $(top_srcdir)/tools/include/nolibc/nolibc.h \ + -I$(top_srcdir)/tools/include/nolibc/ $(KHDR_INCLUDES) + $(OUTPUT)/vdso_test_gettimeofday: parse_vdso.c vdso_test_gettimeofday.c $(OUTPUT)/vdso_test_getcpu: parse_vdso.c vdso_test_getcpu.c $(OUTPUT)/vdso_test_abi: parse_vdso.c vdso_test_abi.c $(OUTPUT)/vdso_test_clock_getres: vdso_test_clock_getres.c -$(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c -$(OUTPUT)/vdso_standalone_test_x86: CFLAGS +=-nostdlib -fno-asynchronous-unwind-tables -fno-stack-protector +$(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c | headers +$(OUTPUT)/vdso_standalone_test_x86: CFLAGS:=$(CFLAGS_NOLIBC) $(CFLAGS) $(OUTPUT)/vdso_test_correctness: vdso_test_correctness.c $(OUTPUT)/vdso_test_correctness: LDFLAGS += -ldl diff --git a/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c b/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c deleted file mode 100644 index 500608f89c66b5747e3d845ebc54e4c3a35b6ccd..0000000000000000000000000000000000000000 --- a/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c +++ /dev/null @@ -1,167 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* - * vdso_test.c: Sample code to test parse_vdso.c on x86 - * Copyright (c) 2011-2014 Andy Lutomirski - * - * You can amuse yourself by compiling with: - * gcc -std=gnu99 -nostdlib - * -Os -fno-asynchronous-unwind-tables -flto -lgcc_s - * vdso_standalone_test_x86.c parse_vdso.c - * to generate a small binary. On x86_64, you can omit -lgcc_s - * if you want the binary to be completely standalone. - */ - -#include -#include -#include -#include -#include - -#include "parse_vdso.h" - -/* We need some libc functions... */ -int strcmp(const char *a, const char *b) -{ - /* This implementation is buggy: it never returns -1. */ - while (*a || *b) { - if (*a != *b) - return 1; - if (*a == 0 || *b == 0) - return 1; - a++; - b++; - } - - return 0; -} - -/* - * The clang build needs this, although gcc does not. - * Stolen from lib/string.c. - */ -void *memcpy(void *dest, const void *src, size_t count) -{ - char *tmp = dest; - const char *s = src; - - while (count--) - *tmp++ = *s++; - return dest; -} - -/* ...and two syscalls. This is x86-specific. */ -static inline long x86_syscall3(long nr, long a0, long a1, long a2) -{ - long ret; -#ifdef __x86_64__ - asm volatile ("syscall" : "=a" (ret) : "a" (nr), - "D" (a0), "S" (a1), "d" (a2) : - "cc", "memory", "rcx", - "r8", "r9", "r10", "r11" ); -#else - asm volatile ("int $0x80" : "=a" (ret) : "a" (nr), - "b" (a0), "c" (a1), "d" (a2) : - "cc", "memory" ); -#endif - return ret; -} - -static inline long linux_write(int fd, const void *data, size_t len) -{ - return x86_syscall3(__NR_write, fd, (long)data, (long)len); -} - -static inline void linux_exit(int code) -{ - x86_syscall3(__NR_exit, code, 0, 0); -} - -void to_base10(char *lastdig, time_t n) -{ - while (n) { - *lastdig = (n % 10) + '0'; - n /= 10; - lastdig--; - } -} - -unsigned long getauxval(const unsigned long *auxv, unsigned long type) -{ - unsigned long ret; - - if (!auxv) - return 0; - - while (1) { - if (!auxv[0] && !auxv[1]) { - ret = 0; - break; - } - - if (auxv[0] == type) { - ret = auxv[1]; - break; - } - - auxv += 2; - } - - return ret; -} - -void c_main(void **stack) -{ - /* Parse the stack */ - long argc = (long)*stack; - stack += argc + 2; - - /* Now we're pointing at the environment. Skip it. */ - while(*stack) - stack++; - stack++; - - /* Now we're pointing at auxv. Initialize the vDSO parser. */ - vdso_init_from_sysinfo_ehdr(getauxval((unsigned long *)stack, AT_SYSINFO_EHDR)); - - /* Find gettimeofday. */ - typedef long (*gtod_t)(struct timeval *tv, struct timezone *tz); - gtod_t gtod = (gtod_t)vdso_sym("LINUX_2.6", "__vdso_gettimeofday"); - - if (!gtod) - linux_exit(1); - - struct timeval tv; - long ret = gtod(&tv, 0); - - if (ret == 0) { - char buf[] = "The time is .000000\n"; - to_base10(buf + 31, tv.tv_sec); - to_base10(buf + 38, tv.tv_usec); - linux_write(1, buf, sizeof(buf) - 1); - } else { - linux_exit(ret); - } - - linux_exit(0); -} - -/* - * This is the real entry point. It passes the initial stack into - * the C entry point. - */ -asm ( - ".text\n" - ".global _start\n" - ".type _start,@function\n" - "_start:\n\t" -#ifdef __x86_64__ - "mov %rsp,%rdi\n\t" - "and $-16,%rsp\n\t" - "sub $8,%rsp\n\t" - "jmp c_main" -#else - "push %esp\n\t" - "call c_main\n\t" - "int $3" -#endif - ); diff --git a/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c b/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c new file mode 120000 index 0000000000000000000000000000000000000000..4d3d96f1e440c965474681a6f35375a60b3921be --- /dev/null +++ b/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c @@ -0,0 +1 @@ +vdso_test_gettimeofday.c \ No newline at end of file