From nobody Tue Dec 16 14:49:55 2025 Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97782281503 for ; Sun, 14 Dec 2025 16:35:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765730159; cv=none; b=n7Lwfg1FIlLxlJy/x7O5C8syhV0RZqV+C0qP0UE3UzsLodK1QS73+sfHYS7t5SYM/42CRbzXkNeYwUqFJW3vqpl4BsYTJN8KHciBxghjBhoi5SAAF5hVK1mPe7EkobPZvHugcOHnu6YtXuOpZJ4YicDyI2+A7NXq8EzwnLgY21U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765730159; c=relaxed/simple; bh=AX9Bi49c6VOIjDClUXqxhL4fzFAElwP2HRI9TAjl2yA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KgE9bqPCjM1QSO42wV9GNOSmuZ6GajtaYtZKMcMaF9a/E9yA3Tb61qpKZZ1N+zKs9QxHsuFMPchlRA1SC/E7vw6ihND/cwCqpKqfHk0bidg7S+7O8O3yNXUkMTLqoUbZ3k2aOPISqYnqmoXLQYNfgr5DnInIQWHOHwsd//TJDbQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FRdA2VhZ; arc=none smtp.client-ip=209.85.167.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FRdA2VhZ" Received: by mail-lf1-f52.google.com with SMTP id 2adb3069b0e04-595819064cdso4353678e87.0 for ; Sun, 14 Dec 2025 08:35:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765730156; x=1766334956; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MzjkaycuriVDIslkX4nv+fXBvUrot6f7f5pS4rb9nTI=; b=FRdA2VhZgW6YB+rRUGRK26DjyMuRiNAfMXM/2IlEIry1tO5dPxxuRfANBGnmvs6MGz KX/0RHgAREa2Gu65u/KZcK4auHXJ24LNXDMqvkM43mYTo7H9vW+e2nbmGbNU7idLRce7 RvQQWg6smUZgaXIHA6XUEIF1kdCUzlyH/Ier3mLZ+AgjUmQYnmukOkYT6jZ/KSwzDP6h fT6tswv1PxTBTAGjRIBcgh44l+gcqHv7+WS+xNnz2J3s5LuoIKy4iHjxQ5JG5M1L2jZp b2Xo87dDE43uEpa0mM5o2H3QDpLMquagV0Zj15RTk43pTyDOXSDxgoEfppXsRKaFtskR KeZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765730156; x=1766334956; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MzjkaycuriVDIslkX4nv+fXBvUrot6f7f5pS4rb9nTI=; b=LBsdM2bjD1zSMHd0+jSbcifMCTJ+y76Z0AqfKSOrbpwtNDNlacUMG5cI9i53Uxc4rR ZoJbjM0P6refRLSjsc4+yupid3lkZTGXXyZXToQ5KvXCI0XR4BYl2QCVal0n0kyFUtH3 AO9qN9AnkIsCZgT9HMQ4Ix5vm/89mQOpG9agFXiSfI1lVnxR37q5Ria/ksmP98sliHb1 fSv7Y0/MEuFNxaEZj388WRvb41GGUP9Y5amavEaCJwzn+okoi0wBf+E4ggbJT/KdEpED MnYulwJoe9PJJZzhOYxWQ6R/s/UHzY5Zpw3SI/qInaZA3u8noBBrCblKuKI1Mi35DdQ3 JUmg== X-Forwarded-Encrypted: i=1; AJvYcCVJwgecdEim73jBpIAn0810I8N9CSoFsnwvr8hj2ZXRi1awSvFDZ7tr1xDKf5DSXA1Bnl9F3JnjNA0sykw=@vger.kernel.org X-Gm-Message-State: AOJu0YyjjrKNRX88Z/DeMGts1SQYZwu4Hte661efIX2C5TNVa8m/qZWH Eox8DXH8ELur/Jx9KoRZReBpCJUd2xv21/LypmqmE5umcg9OmXOER9aT X-Gm-Gg: AY/fxX6yNtFW6XEOMgeEHYn63HwHa5a97cxtse7W4BcJ6mWZNnqnIP1u/pjP7KSMbTA faYY/4MLgNaJCbntOXj3cqBoZydYclSRPPUbcMZW6KPUKevs2bvVGfAlu2bKmdI/BtMd48ysoEq BijfDvl5N0npgz97KbeFabdt11ADqEhPBT5cAX8Df8nP9xE3yMgYwdmpcxCT71Amc7xRcCr4PNQ gA7j2H1rnf7m+11O64/8CKjxGtM+166kVM+8as6jcwBS2AZx9k3x6r6aGX0ikFYaYui9KvvjSiC rNB6WOeknIMqizeOKBAJfVLxyzxKAUYtcHqNvdtKRsxoBQoozh1ektIGnvbB52t7WaPGnI1ZpQt mSRz9AFfg9FNeOk9mbbgqqYtrwXzRJgkS6cJqckxYN8qx6pXnkb3QQPhefhuUKQirj/Dh8ZlBFP kFtw== X-Google-Smtp-Source: AGHT+IFEo7YnyX/RrmJbiSGf+H84hqlpjB1NYRQJ0t5IGQa+lkiCRASkjTEgJgxSlpqyoasVp+264w== X-Received: by 2002:a05:6512:3c8f:b0:596:9cf0:fb85 with SMTP id 2adb3069b0e04-598f3bb013emr3764095e87.4.1765730155530; Sun, 14 Dec 2025 08:35:55 -0800 (PST) Received: from curiosity ([5.188.167.4]) by smtp.googlemail.com with ESMTPSA id 2adb3069b0e04-598f7717b79sm3789618e87.60.2025.12.14.08.35.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 14 Dec 2025 08:35:53 -0800 (PST) From: Sergey Matyukevich To: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Cc: Paul Walmsley , Palmer Dabbelt , Alexandre Ghiti , Oleg Nesterov , Shuah Khan , Thomas Huth , Charlie Jenkins , Andy Chiu , Samuel Holland , Joel Granados , Conor Dooley , Yong-Xuan Wang , Heiko Stuebner , Guo Ren , Sergey Matyukevich Subject: [PATCH v5 5/9] selftests: riscv: test ptrace vector interface Date: Sun, 14 Dec 2025 19:35:09 +0300 Message-ID: <20251214163537.1054292-6-geomatsi@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251214163537.1054292-1-geomatsi@gmail.com> References: <20251214163537.1054292-1-geomatsi@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a test case to check ptrace behavior in the case when vector extension is supported by the system, but vector context is not yet enabled for the traced process. Signed-off-by: Sergey Matyukevich Reviewed-by: Andy Chiu --- .../testing/selftests/riscv/vector/.gitignore | 2 + tools/testing/selftests/riscv/vector/Makefile | 10 ++- .../selftests/riscv/vector/v_helpers.c | 23 ++++++ .../selftests/riscv/vector/v_helpers.h | 2 + .../riscv/vector/validate_v_ptrace.c | 80 +++++++++++++++++++ 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/riscv/vector/validate_v_ptrace.c diff --git a/tools/testing/selftests/riscv/vector/.gitignore b/tools/testin= g/selftests/riscv/vector/.gitignore index 7d9c87cd0649..40a82baf364f 100644 --- a/tools/testing/selftests/riscv/vector/.gitignore +++ b/tools/testing/selftests/riscv/vector/.gitignore @@ -2,3 +2,5 @@ vstate_exec_nolibc vstate_prctl v_initval v_exec_initval_nolibc +vstate_ptrace +validate_v_ptrace diff --git a/tools/testing/selftests/riscv/vector/Makefile b/tools/testing/= selftests/riscv/vector/Makefile index 2c2a33fc083e..326dafd739bf 100644 --- a/tools/testing/selftests/riscv/vector/Makefile +++ b/tools/testing/selftests/riscv/vector/Makefile @@ -2,11 +2,14 @@ # Copyright (C) 2021 ARM Limited # Originally tools/testing/arm64/abi/Makefile =20 -TEST_GEN_PROGS :=3D v_initval vstate_prctl vstate_ptrace +TEST_GEN_PROGS :=3D v_initval vstate_prctl vstate_ptrace validate_v_ptrace TEST_GEN_PROGS_EXTENDED :=3D vstate_exec_nolibc v_exec_initval_nolibc +TEST_GEN_LIBS :=3D v_helpers.c sys_hwprobe.c =20 include ../../lib.mk =20 +TEST_GEN_OBJ :=3D $(patsubst %.c, $(OUTPUT)/%.o, $(TEST_GEN_LIBS)) + $(OUTPUT)/sys_hwprobe.o: ../hwprobe/sys_hwprobe.S $(CC) -static -c -o$@ $(CFLAGS) $^ =20 @@ -29,3 +32,8 @@ $(OUTPUT)/v_exec_initval_nolibc: v_exec_initval_nolibc.c =20 $(OUTPUT)/vstate_ptrace: vstate_ptrace.c $(OUTPUT)/sys_hwprobe.o $(OUTPUT)= /v_helpers.o $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^ + +$(OUTPUT)/validate_v_ptrace: validate_v_ptrace.c $(OUTPUT)/sys_hwprobe.o $= (OUTPUT)/v_helpers.o + $(CC) -static -o$@ $(CFLAGS) $(LDFLAGS) $^ + +EXTRA_CLEAN +=3D $(TEST_GEN_OBJ) diff --git a/tools/testing/selftests/riscv/vector/v_helpers.c b/tools/testi= ng/selftests/riscv/vector/v_helpers.c index 01a8799dcb78..de6da7c8d2f1 100644 --- a/tools/testing/selftests/riscv/vector/v_helpers.c +++ b/tools/testing/selftests/riscv/vector/v_helpers.c @@ -26,6 +26,29 @@ bool is_vector_supported(void) return pair.value & RISCV_HWPROBE_EXT_ZVE32X; } =20 +unsigned long get_vr_len(void) +{ + unsigned long vlenb; + + if (is_vector_supported()) { + asm volatile("csrr %[vlenb], vlenb" : [vlenb] "=3Dr"(vlenb)); + return vlenb; + } + + if (is_xtheadvector_supported()) { + asm volatile ( + // 0 | zimm[10:0] | rs1 | 1 1 1 | rd | 1010111 | vsetvli + // vsetvli t4, x0, e8, m1, d1 + ".4byte 0b00000000000000000111111011010111\n\t" + "mv %[vlenb], t4\n\t" + : [vlenb] "=3Dr"(vlenb) : : "memory", "t4"); + return vlenb; + } + + printf("WARNING: vector not supported\n"); + return 0; +} + int launch_test(char *next_program, int test_inherit, int xtheadvector) { char *exec_argv[4], *exec_envp[1]; diff --git a/tools/testing/selftests/riscv/vector/v_helpers.h b/tools/testi= ng/selftests/riscv/vector/v_helpers.h index 763cddfe26da..c538077f1195 100644 --- a/tools/testing/selftests/riscv/vector/v_helpers.h +++ b/tools/testing/selftests/riscv/vector/v_helpers.h @@ -5,4 +5,6 @@ bool is_xtheadvector_supported(void); =20 bool is_vector_supported(void); =20 +unsigned long get_vr_len(void); + int launch_test(char *next_program, int test_inherit, int xtheadvector); diff --git a/tools/testing/selftests/riscv/vector/validate_v_ptrace.c b/too= ls/testing/selftests/riscv/vector/validate_v_ptrace.c new file mode 100644 index 000000000000..b64986b42270 --- /dev/null +++ b/tools/testing/selftests/riscv/vector/validate_v_ptrace.c @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0-only +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "kselftest_harness.h" +#include "v_helpers.h" + +volatile unsigned long chld_lock; + +TEST(ptrace_v_not_enabled) +{ + pid_t pid; + + if (!(is_vector_supported() || is_xtheadvector_supported())) + SKIP(return, "Vector not supported"); + + chld_lock =3D 1; + pid =3D fork(); + ASSERT_LE(0, pid) + TH_LOG("fork: %m"); + + if (pid =3D=3D 0) { + while (chld_lock =3D=3D 1) + asm volatile("" : : "g"(chld_lock) : "memory"); + + asm volatile ("ebreak" : : : ); + } else { + struct __riscv_v_regset_state *regset_data; + unsigned long vlenb =3D get_vr_len(); + size_t regset_size; + struct iovec iov; + int status; + int ret; + + /* attach */ + + ASSERT_EQ(0, ptrace(PTRACE_ATTACH, pid, NULL, NULL)); + ASSERT_EQ(pid, waitpid(pid, &status, 0)); + ASSERT_TRUE(WIFSTOPPED(status)); + + /* unlock */ + + ASSERT_EQ(0, ptrace(PTRACE_POKEDATA, pid, &chld_lock, 0)); + + /* resume and wait for ebreak */ + + ASSERT_EQ(0, ptrace(PTRACE_CONT, pid, NULL, NULL)); + ASSERT_EQ(pid, waitpid(pid, &status, 0)); + ASSERT_TRUE(WIFSTOPPED(status)); + + /* try to read vector registers from the tracee */ + + regset_size =3D sizeof(*regset_data) + vlenb * 32; + regset_data =3D calloc(1, regset_size); + + iov.iov_base =3D regset_data; + iov.iov_len =3D regset_size; + + /* V extension is available, but not yet enabled for the tracee */ + + errno =3D 0; + ret =3D ptrace(PTRACE_GETREGSET, pid, NT_RISCV_VECTOR, &iov); + ASSERT_EQ(ENODATA, errno); + ASSERT_EQ(-1, ret); + + /* cleanup */ + + ASSERT_EQ(0, kill(pid, SIGKILL)); + } +} + +TEST_HARNESS_MAIN --=20 2.52.0