From nobody Mon Feb 9 13:58:10 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 4FF4420E030 for ; Fri, 6 Feb 2026 00:23:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770337436; cv=none; b=pzWGfPWUp5EmXuFMogui9HQkq+8oMnQSQzfTRZiWLBZB+q/Sls8xGwa3J1bUDVVQvpkjaBiT7IAzRXBczX9PqZ6pyLts1Yx6rYP8RJEF0+ZLNZRi9M6sz7T+VZPCwrwPueEcOnZnc6sBKvtT/nv8UnCynKOUX+TN+WxnelSj0Nc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770337436; c=relaxed/simple; bh=FFJaRcaZ2DZorWNCyiOza1DYcccDs+CO23hwkWDUxHg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nmTLXhwvs2VO6+gBMEFNxoZfIQX/3F2grR/yVI5igHx8fSu13WrLqM5CA/0DLuR0LJQAxcoRlmw24MAwfzqNlKLb86adVdAVL41w/8pX5Kz6tZU/Utap/8XNIBgLReaAzQbAKq4/+lMluwdK11UsrnI49vQz8FkapOpvf5K1NNo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=JBkMcmrt; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=agIzpnvx; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="JBkMcmrt"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="agIzpnvx" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 615IEda4571782 for ; Fri, 6 Feb 2026 00:23:55 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=0jHTOUh63QR itbxNqeAiRHFokl+l9LDXY55njNcfYKI=; b=JBkMcmrt2yyfc8JtxzjO+QhYVbL vYRnUOMvWn2v61rY2wppNXQSdmUiFFUwt/lyd16WzY43gxx3c2z/gp4tC+cE7+aE gOHKK8ifXL+3bWn+J6FWvquyMPHix9HOUt6/9HhyrulEzgNL1umvywUISip/fdwL SZTn+aG/7Y2lW2XAL0dj1U6T9bFX6h8iV/jnxq25s8Qy/kJD/qEJ9fkdIF8oYUvD 3ksZjAd6eIEWPinqkkZ0T2rK+Os0wOySiODXcbZJVlAEOmBqFclT2s8FBZUjo0xL 8mr9RxoUbnAyzyQXZfeJCiaAHUmaGjVhL7Jjfzu7dtb8mE7i+Ofj4QqOCmQ== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c50a992m1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 06 Feb 2026 00:23:55 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-2b74766fae7so1462319eec.0 for ; Thu, 05 Feb 2026 16:23:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1770337434; x=1770942234; 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=0jHTOUh63QRitbxNqeAiRHFokl+l9LDXY55njNcfYKI=; b=agIzpnvx8b7x+dK0LRGwdjO5EMCE5fWeaB/EeFgRYHvBrYucmCRdgCE2eotsif2/kh FIahZVfn0QWBzHLfXDQwe8xDoHqy72UN1awfU8E2ehv6eHSlKjgil21B3AbYoN61T/xE SKqCsw6kSvNC5ugANJyS3ned7uHEH7NGqgL53frrHP4kuiwPzZF5jKGDLObi8UTFaykj Kmg3Qg5yV2g1r41wKm0EqILjH+KIWd1m4qn56rh63eCii9hyfSiI++HfO8goZMEUnjZt xl6AUn9hKQ1fYnoJEhOiSLnMS7SeL/1rcoepl5UD6mMl97bGdLwvrBlafhVS5GwzWs70 fc7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770337434; x=1770942234; 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=0jHTOUh63QRitbxNqeAiRHFokl+l9LDXY55njNcfYKI=; b=PPmJfQJahN0zAh0Hg6J0Hnv7HOoF1nZg6P7UyeYeCYgPCjQhoSCXOR+FvHG8xwFrvL FZE2w7LZ+7MGjtIFTTzwXFn7NgSqJxd7cSTYVwEaHE3pGB674pqfp44GRAyAZyVh2GdA f/nhwGOEcOzOeiy+pICfAWRRiEzzKPmdxOuhXc5fq/duPhs1G/vMbbrqvN8SfClIhsf5 lFCfvEPFDdS/H5c8ZQyELjORYGmh8sgsiZZMt+OxQeXerUzRayh2UgokueJ7lVBh3xS8 pCcbwe/aDPi2QT2I8BFpZ/Tt36b9NML3sLQTt8/UW95XOBm3eUkr7JQOk/1R4Ir1xSuF bQKA== X-Gm-Message-State: AOJu0YyVdot3OWF8Z+A1MGWUNpGiXtuATGecHZjh7ypZ0vsm49j+7TC7 QWuu52qvrrHXSuc/4Y3s+DRvcz02IPWK0ikQiyrXnP4X4vGm09i1LS7pdi4R9r9hjD9nSl3JLZs +Ea+6CS2TlcG0yvY4jt6gYQBLIViSYB3yM7pknsGC1oooMcI9SAdRyS5DPfZeQnqt+D0rqFwjpO U= X-Gm-Gg: AZuq6aJnogKsZxypdrHO5TZkNRGd34fxHBw+f+7qEO5+pF+VQ/iMT6MVCjUsIBDi+6g zIV47i8MAln3ZLnzaFDCKVEq1Kh802S0Wssbj3+tjhi+h1A5iwOf9V+U1jos/nJGg/bhc6rrncU Azp4kFdoT0f5bs1TxveKChpZkByKt1JAwHuXcF9TDV7neLa+vpkk3H/SGCTGOoc89Vd/gRUqz98 y7VSS8ThSrSiO3Qx1of58nachOq0LNQT8LOHO6ZHJ+u3AzOPh6p3pVULQhqPAQ1YvBS2ZGhFoqU cryZgEFE338UOuTzyNNYUQHkwoRf3C6JC2P/UmKGiWEBHCHxGf1cubdbYs0JUD8RfQdU7/X8xGX JOflNHX6J7hUdJPJDiaY= X-Received: by 2002:a05:7301:1699:b0:2b7:961e:1b78 with SMTP id 5a478bee46e88-2b856400accmr390625eec.12.1770337433885; Thu, 05 Feb 2026 16:23:53 -0800 (PST) X-Received: by 2002:a05:7301:1699:b0:2b7:961e:1b78 with SMTP id 5a478bee46e88-2b856400accmr390619eec.12.1770337433182; Thu, 05 Feb 2026 16:23:53 -0800 (PST) Received: from localhost ([140.82.166.162]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2b855c8a8f6sm637774eec.32.2026.02.05.16.23.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Feb 2026 16:23:52 -0800 (PST) From: Andrew Jones To: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, kvm-riscv@lists.infradead.org Cc: Paul Walmsley , Palmer Dabbelt , Anup Patel , =?UTF-8?q?Cl=C3=A9ment=20L=C3=A9ger?= , Conor Dooley , Guodong Xu , Charlie Jenkins , Charlie Jenkins , Samuel Holland Subject: [RFC PATCH v1 01/11] riscv: hwprobe: add support for RISCV_HWPROBE_KEY_IMA_EXT_1 Date: Thu, 5 Feb 2026 18:23:39 -0600 Message-ID: <20260206002349.96740-2-andrew.jones@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260206002349.96740-1-andrew.jones@oss.qualcomm.com> References: <20260206002349.96740-1-andrew.jones@oss.qualcomm.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 X-Proofpoint-GUID: mqMteHEiOLelkbWBM_hfQLs64zL8TVTw X-Proofpoint-ORIG-GUID: mqMteHEiOLelkbWBM_hfQLs64zL8TVTw X-Authority-Analysis: v=2.4 cv=e6ALiKp/ c=1 sm=1 tr=0 ts=6985349b cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=cvcws7F5//HeuvjG1O1erQ==:17 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=j9gIX6CO6tostgs0pIYA:9 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA2MDAwMSBTYWx0ZWRfX1HxqXHzP+emA AzP+bd6PifQN5mvSpP4a40fvEdfn3uj+DfaTXjWEDBagbUJqnn1zmeHNUctuTqj7bkJVd3K5nZm dVso+yjPpqbyqsU/wVq3Z9ppzR2Qg498Fi+0weslYGFjYky2bKuCZz0isp4l8r+ZuFhdF1GYNY1 IXeouXsRS5QSBhZ90r7uW1m17i61TtqbyOEWBySBGoKyvmKJMckWZA3pB9MKRL5VCl/XmRoCpc1 HfrVuESUuqo6yJo0snvhw5FZ6sn071s3Qc+rlN535Ukyns45Nc3ee+G85//aLcjQ63XuOnnkx5Q ZxCG1t1r550Qg+1A9jBWshVuphNAKWUjj8wDryhkwnBHPoTuDsZq6e93zWBKpd4Lwimv7ysS6FC BhFa3mFr1ZG4rsK35mdiUA1UaUYDCJJV907xDzq+plUR48DE3d7p2HQImeLEBdbJPD7quB9AFW4 +fpmDISmKaPqygLlucQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-05_06,2026-02-05_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 adultscore=0 clxscore=1015 lowpriorityscore=0 bulkscore=0 suspectscore=0 phishscore=0 malwarescore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602060001 Content-Type: text/plain; charset="utf-8" From: Paul Walmsley We've run out of bits to describe RISC-V ISA extensions in our initial hwprobe key, RISCV_HWPROBE_KEY_IMA_EXT_0. So, let's add RISCV_HWPROBE_KEY_IMA_EXT_1, along with the framework to set the appropriate hwprobe tuple, and add testing for it. Signed-off-by: Paul Walmsley Reviewed-by: Andrew Jones Signed-off-by: Andrew Jones --- Documentation/arch/riscv/hwprobe.rst | 4 + arch/riscv/include/asm/hwprobe.h | 3 +- arch/riscv/include/uapi/asm/hwprobe.h | 1 + arch/riscv/kernel/sys_hwprobe.c | 169 +++++++++++------- .../selftests/riscv/hwprobe/which-cpus.c | 18 +- 5 files changed, 120 insertions(+), 75 deletions(-) diff --git a/Documentation/arch/riscv/hwprobe.rst b/Documentation/arch/risc= v/hwprobe.rst index 641ec4abb906..03484a2546da 100644 --- a/Documentation/arch/riscv/hwprobe.rst +++ b/Documentation/arch/riscv/hwprobe.rst @@ -387,3 +387,7 @@ The following keys are defined: =20 * :c:macro:`RISCV_HWPROBE_KEY_ZICBOP_BLOCK_SIZE`: An unsigned int which represents the size of the Zicbop block in bytes. + +* :c:macro:`RISCV_HWPROBE_KEY_IMA_EXT_1`: A bitmask containing additional + extensions that are compatible with the + :c:macro:`RISCV_HWPROBE_BASE_BEHAVIOR_IMA`: base system behavior. diff --git a/arch/riscv/include/asm/hwprobe.h b/arch/riscv/include/asm/hwpr= obe.h index 8c572a464719..8b9f5e1cf4cb 100644 --- a/arch/riscv/include/asm/hwprobe.h +++ b/arch/riscv/include/asm/hwprobe.h @@ -8,7 +8,7 @@ =20 #include =20 -#define RISCV_HWPROBE_MAX_KEY 15 +#define RISCV_HWPROBE_MAX_KEY 16 =20 static inline bool riscv_hwprobe_key_is_valid(__s64 key) { @@ -20,6 +20,7 @@ static inline bool hwprobe_key_is_bitmask(__s64 key) switch (key) { case RISCV_HWPROBE_KEY_BASE_BEHAVIOR: case RISCV_HWPROBE_KEY_IMA_EXT_0: + case RISCV_HWPROBE_KEY_IMA_EXT_1: case RISCV_HWPROBE_KEY_CPUPERF_0: case RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0: case RISCV_HWPROBE_KEY_VENDOR_EXT_MIPS_0: diff --git a/arch/riscv/include/uapi/asm/hwprobe.h b/arch/riscv/include/uap= i/asm/hwprobe.h index cd3c126730c3..ed2621a5a47d 100644 --- a/arch/riscv/include/uapi/asm/hwprobe.h +++ b/arch/riscv/include/uapi/asm/hwprobe.h @@ -113,6 +113,7 @@ struct riscv_hwprobe { #define RISCV_HWPROBE_KEY_VENDOR_EXT_SIFIVE_0 13 #define RISCV_HWPROBE_KEY_VENDOR_EXT_MIPS_0 14 #define RISCV_HWPROBE_KEY_ZICBOP_BLOCK_SIZE 15 +#define RISCV_HWPROBE_KEY_IMA_EXT_1 16 /* Increase RISCV_HWPROBE_MAX_KEY when adding items. */ =20 /* Flags */ diff --git a/arch/riscv/kernel/sys_hwprobe.c b/arch/riscv/kernel/sys_hwprob= e.c index e6787ba7f2fc..53731ace7984 100644 --- a/arch/riscv/kernel/sys_hwprobe.c +++ b/arch/riscv/kernel/sys_hwprobe.c @@ -24,6 +24,14 @@ #include =20 =20 +#define EXT_KEY(isa_arg, ext, pv, missing) \ + do { \ + if (__riscv_isa_extension_available(isa_arg, RISCV_ISA_EXT_##ext)) \ + pv |=3D RISCV_HWPROBE_EXT_##ext; \ + else \ + missing |=3D RISCV_HWPROBE_EXT_##ext; \ + } while (false) + static void hwprobe_arch_id(struct riscv_hwprobe *pair, const struct cpumask *cpus) { @@ -93,90 +101,109 @@ static void hwprobe_isa_ext0(struct riscv_hwprobe *pa= ir, for_each_cpu(cpu, cpus) { struct riscv_isainfo *isainfo =3D &hart_isa[cpu]; =20 -#define EXT_KEY(ext) \ - do { \ - if (__riscv_isa_extension_available(isainfo->isa, RISCV_ISA_EXT_##ext)) \ - pair->value |=3D RISCV_HWPROBE_EXT_##ext; \ - else \ - missing |=3D RISCV_HWPROBE_EXT_##ext; \ - } while (false) - /* * Only use EXT_KEY() for extensions which can be exposed to userspace, * regardless of the kernel's configuration, as no other checks, besides * presence in the hart_isa bitmap, are made. */ - EXT_KEY(ZAAMO); - EXT_KEY(ZABHA); - EXT_KEY(ZACAS); - EXT_KEY(ZALASR); - EXT_KEY(ZALRSC); - EXT_KEY(ZAWRS); - EXT_KEY(ZBA); - EXT_KEY(ZBB); - EXT_KEY(ZBC); - EXT_KEY(ZBKB); - EXT_KEY(ZBKC); - EXT_KEY(ZBKX); - EXT_KEY(ZBS); - EXT_KEY(ZCA); - EXT_KEY(ZCB); - EXT_KEY(ZCLSD); - EXT_KEY(ZCMOP); - EXT_KEY(ZICBOM); - EXT_KEY(ZICBOP); - EXT_KEY(ZICBOZ); - EXT_KEY(ZICNTR); - EXT_KEY(ZICOND); - EXT_KEY(ZIHINTNTL); - EXT_KEY(ZIHINTPAUSE); - EXT_KEY(ZIHPM); - EXT_KEY(ZILSD); - EXT_KEY(ZIMOP); - EXT_KEY(ZKND); - EXT_KEY(ZKNE); - EXT_KEY(ZKNH); - EXT_KEY(ZKSED); - EXT_KEY(ZKSH); - EXT_KEY(ZKT); - EXT_KEY(ZTSO); + EXT_KEY(isainfo->isa, ZAAMO, pair->value, missing); + EXT_KEY(isainfo->isa, ZABHA, pair->value, missing); + EXT_KEY(isainfo->isa, ZACAS, pair->value, missing); + EXT_KEY(isainfo->isa, ZALASR, pair->value, missing); + EXT_KEY(isainfo->isa, ZALRSC, pair->value, missing); + EXT_KEY(isainfo->isa, ZAWRS, pair->value, missing); + EXT_KEY(isainfo->isa, ZBA, pair->value, missing); + EXT_KEY(isainfo->isa, ZBB, pair->value, missing); + EXT_KEY(isainfo->isa, ZBC, pair->value, missing); + EXT_KEY(isainfo->isa, ZBKB, pair->value, missing); + EXT_KEY(isainfo->isa, ZBKC, pair->value, missing); + EXT_KEY(isainfo->isa, ZBKX, pair->value, missing); + EXT_KEY(isainfo->isa, ZBS, pair->value, missing); + EXT_KEY(isainfo->isa, ZCA, pair->value, missing); + EXT_KEY(isainfo->isa, ZCB, pair->value, missing); + EXT_KEY(isainfo->isa, ZCLSD, pair->value, missing); + EXT_KEY(isainfo->isa, ZCMOP, pair->value, missing); + EXT_KEY(isainfo->isa, ZICBOM, pair->value, missing); + EXT_KEY(isainfo->isa, ZICBOP, pair->value, missing); + EXT_KEY(isainfo->isa, ZICBOZ, pair->value, missing); + EXT_KEY(isainfo->isa, ZICNTR, pair->value, missing); + EXT_KEY(isainfo->isa, ZICOND, pair->value, missing); + EXT_KEY(isainfo->isa, ZIHINTNTL, pair->value, missing); + EXT_KEY(isainfo->isa, ZIHINTPAUSE, pair->value, missing); + EXT_KEY(isainfo->isa, ZIHPM, pair->value, missing); + EXT_KEY(isainfo->isa, ZILSD, pair->value, missing); + EXT_KEY(isainfo->isa, ZIMOP, pair->value, missing); + EXT_KEY(isainfo->isa, ZKND, pair->value, missing); + EXT_KEY(isainfo->isa, ZKNE, pair->value, missing); + EXT_KEY(isainfo->isa, ZKNH, pair->value, missing); + EXT_KEY(isainfo->isa, ZKSED, pair->value, missing); + EXT_KEY(isainfo->isa, ZKSH, pair->value, missing); + EXT_KEY(isainfo->isa, ZKT, pair->value, missing); + EXT_KEY(isainfo->isa, ZTSO, pair->value, missing); =20 /* * All the following extensions must depend on the kernel * support of V. */ if (has_vector()) { - EXT_KEY(ZVBB); - EXT_KEY(ZVBC); - EXT_KEY(ZVE32F); - EXT_KEY(ZVE32X); - EXT_KEY(ZVE64D); - EXT_KEY(ZVE64F); - EXT_KEY(ZVE64X); - EXT_KEY(ZVFBFMIN); - EXT_KEY(ZVFBFWMA); - EXT_KEY(ZVFH); - EXT_KEY(ZVFHMIN); - EXT_KEY(ZVKB); - EXT_KEY(ZVKG); - EXT_KEY(ZVKNED); - EXT_KEY(ZVKNHA); - EXT_KEY(ZVKNHB); - EXT_KEY(ZVKSED); - EXT_KEY(ZVKSH); - EXT_KEY(ZVKT); + EXT_KEY(isainfo->isa, ZVBB, pair->value, missing); + EXT_KEY(isainfo->isa, ZVBC, pair->value, missing); + EXT_KEY(isainfo->isa, ZVE32F, pair->value, missing); + EXT_KEY(isainfo->isa, ZVE32X, pair->value, missing); + EXT_KEY(isainfo->isa, ZVE64D, pair->value, missing); + EXT_KEY(isainfo->isa, ZVE64F, pair->value, missing); + EXT_KEY(isainfo->isa, ZVE64X, pair->value, missing); + EXT_KEY(isainfo->isa, ZVFBFMIN, pair->value, missing); + EXT_KEY(isainfo->isa, ZVFBFWMA, pair->value, missing); + EXT_KEY(isainfo->isa, ZVFH, pair->value, missing); + EXT_KEY(isainfo->isa, ZVFHMIN, pair->value, missing); + EXT_KEY(isainfo->isa, ZVKB, pair->value, missing); + EXT_KEY(isainfo->isa, ZVKG, pair->value, missing); + EXT_KEY(isainfo->isa, ZVKNED, pair->value, missing); + EXT_KEY(isainfo->isa, ZVKNHA, pair->value, missing); + EXT_KEY(isainfo->isa, ZVKNHB, pair->value, missing); + EXT_KEY(isainfo->isa, ZVKSED, pair->value, missing); + EXT_KEY(isainfo->isa, ZVKSH, pair->value, missing); + EXT_KEY(isainfo->isa, ZVKT, pair->value, missing); } =20 - EXT_KEY(ZCD); - EXT_KEY(ZCF); - EXT_KEY(ZFA); - EXT_KEY(ZFBFMIN); - EXT_KEY(ZFH); - EXT_KEY(ZFHMIN); + EXT_KEY(isainfo->isa, ZCD, pair->value, missing); + EXT_KEY(isainfo->isa, ZCF, pair->value, missing); + EXT_KEY(isainfo->isa, ZFA, pair->value, missing); + EXT_KEY(isainfo->isa, ZFBFMIN, pair->value, missing); + EXT_KEY(isainfo->isa, ZFH, pair->value, missing); + EXT_KEY(isainfo->isa, ZFHMIN, pair->value, missing); =20 if (IS_ENABLED(CONFIG_RISCV_ISA_SUPM)) - EXT_KEY(SUPM); -#undef EXT_KEY + EXT_KEY(isainfo->isa, SUPM, pair->value, missing); + } + + /* Now turn off reporting features if any CPU is missing it. */ + pair->value &=3D ~missing; +} + +static void hwprobe_isa_ext1(struct riscv_hwprobe *pair, + const struct cpumask *cpus) +{ + int cpu; + u64 missing =3D 0; + + pair->value =3D 0; + + /* + * Loop through and record extensions that 1) anyone has, and 2) anyone + * doesn't have. + */ + for_each_cpu(cpu, cpus) { + /* struct riscv_isainfo *isainfo =3D &hart_isa[cpu]; */ + + /* + * Only use EXT_KEY() for extensions which can be + * exposed to userspace, regardless of the kernel's + * configuration, as no other checks, besides presence + * in the hart_isa bitmap, are made. + */ + /* Nothing here yet */ } =20 /* Now turn off reporting features if any CPU is missing it. */ @@ -287,6 +314,10 @@ static void hwprobe_one_pair(struct riscv_hwprobe *pai= r, hwprobe_isa_ext0(pair, cpus); break; =20 + case RISCV_HWPROBE_KEY_IMA_EXT_1: + hwprobe_isa_ext1(pair, cpus); + break; + case RISCV_HWPROBE_KEY_CPUPERF_0: case RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF: pair->value =3D hwprobe_misaligned(cpus); diff --git a/tools/testing/selftests/riscv/hwprobe/which-cpus.c b/tools/tes= ting/selftests/riscv/hwprobe/which-cpus.c index 3ab53067e8dd..587feb198c04 100644 --- a/tools/testing/selftests/riscv/hwprobe/which-cpus.c +++ b/tools/testing/selftests/riscv/hwprobe/which-cpus.c @@ -83,9 +83,9 @@ static void do_which_cpus(int argc, char **argv, cpu_set_= t *cpus) =20 int main(int argc, char **argv) { - struct riscv_hwprobe pairs[2]; + struct riscv_hwprobe pairs[3]; cpu_set_t cpus_aff, cpus; - __u64 ext0_all; + __u64 ext0_all, ext1_all; long rc; =20 rc =3D sched_getaffinity(0, sizeof(cpu_set_t), &cpus_aff); @@ -112,6 +112,11 @@ int main(int argc, char **argv) assert(rc =3D=3D 0 && pairs[0].key =3D=3D RISCV_HWPROBE_KEY_IMA_EXT_0); ext0_all =3D pairs[0].value; =20 + pairs[0] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_IMA_EXT_1= , }; + rc =3D riscv_hwprobe(pairs, 1, 0, NULL, 0); + assert(rc =3D=3D 0 && pairs[0].key =3D=3D RISCV_HWPROBE_KEY_IMA_EXT_1); + ext1_all =3D pairs[0].value; + pairs[0] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_BASE_BEHA= VIOR, .value =3D RISCV_HWPROBE_BASE_BEHAVIOR_IMA, }; CPU_ZERO(&cpus); rc =3D riscv_hwprobe(pairs, 1, 0, (unsigned long *)&cpus, RISCV_HWPROBE_W= HICH_CPUS); @@ -134,20 +139,23 @@ int main(int argc, char **argv) =20 pairs[0] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_BASE_BEHA= VIOR, .value =3D RISCV_HWPROBE_BASE_BEHAVIOR_IMA, }; pairs[1] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_IMA_EXT_0= , .value =3D ext0_all, }; + pairs[2] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_IMA_EXT_1= , .value =3D ext1_all, }; CPU_ZERO(&cpus); - rc =3D riscv_hwprobe(pairs, 2, sizeof(cpu_set_t), (unsigned long *)&cpus,= RISCV_HWPROBE_WHICH_CPUS); + rc =3D riscv_hwprobe(pairs, 3, sizeof(cpu_set_t), (unsigned long *)&cpus,= RISCV_HWPROBE_WHICH_CPUS); ksft_test_result(rc =3D=3D 0 && CPU_COUNT(&cpus) =3D=3D sysconf(_SC_NPROC= ESSORS_ONLN), "set all cpus\n"); =20 pairs[0] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_BASE_BEHA= VIOR, .value =3D RISCV_HWPROBE_BASE_BEHAVIOR_IMA, }; pairs[1] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_IMA_EXT_0= , .value =3D ext0_all, }; + pairs[2] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_IMA_EXT_1= , .value =3D ext1_all, }; memcpy(&cpus, &cpus_aff, sizeof(cpu_set_t)); - rc =3D riscv_hwprobe(pairs, 2, sizeof(cpu_set_t), (unsigned long *)&cpus,= RISCV_HWPROBE_WHICH_CPUS); + rc =3D riscv_hwprobe(pairs, 3, sizeof(cpu_set_t), (unsigned long *)&cpus,= RISCV_HWPROBE_WHICH_CPUS); ksft_test_result(rc =3D=3D 0 && CPU_EQUAL(&cpus, &cpus_aff), "set all aff= inity cpus\n"); =20 pairs[0] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_BASE_BEHA= VIOR, .value =3D RISCV_HWPROBE_BASE_BEHAVIOR_IMA, }; pairs[1] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_IMA_EXT_0= , .value =3D ~ext0_all, }; + pairs[2] =3D (struct riscv_hwprobe){ .key =3D RISCV_HWPROBE_KEY_IMA_EXT_1= , .value =3D ~ext1_all, }; memcpy(&cpus, &cpus_aff, sizeof(cpu_set_t)); - rc =3D riscv_hwprobe(pairs, 2, sizeof(cpu_set_t), (unsigned long *)&cpus,= RISCV_HWPROBE_WHICH_CPUS); + rc =3D riscv_hwprobe(pairs, 3, sizeof(cpu_set_t), (unsigned long *)&cpus,= RISCV_HWPROBE_WHICH_CPUS); ksft_test_result(rc =3D=3D 0 && CPU_COUNT(&cpus) =3D=3D 0, "clear all cpu= s\n"); =20 ksft_finished(); --=20 2.43.0