From nobody Mon Nov 3 18:05:24 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529942630005104.30938868429587; Mon, 25 Jun 2018 09:03:50 -0700 (PDT) Received: from localhost ([::1]:47997 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXTy1-0007VJ-9y for importer@patchew.org; Mon, 25 Jun 2018 12:03:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52755) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXTuZ-0004oc-9S for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fXTuW-00050z-5Q for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:15 -0400 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:52882) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fXTuV-00050M-Uf for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:12 -0400 Received: by mail-wm0-x242.google.com with SMTP id p126-v6so9909152wmb.2 for ; Mon, 25 Jun 2018 09:00:11 -0700 (PDT) Received: from zen.linaro.local ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id g11-v6sm15870933wrr.46.2018.06.25.09.00.09 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 25 Jun 2018 09:00:09 -0700 (PDT) Received: from zen.linaroharston (localhost [127.0.0.1]) by zen.linaro.local (Postfix) with ESMTP id 4A3FD3E0866; Mon, 25 Jun 2018 17:00:09 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jw+vFO42AWQuky1xdpGzosmSyOqmsc+deFAWMnBM/sg=; b=VxzIpma3VPNKdSQ7OzVYCETDZg2WzgA20De3aWdWTDBV8SLXgfNAeWyk1aWLPimb7K +Q67LCxknAWiw1wIWC54GuoZKMcgka0r9bnw2UIXps/TAuw03m/rXsn9I5m8fj0URW2q jBYU81aUxzazgHsJO2yS/eE7akcVb1UYjfqSU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jw+vFO42AWQuky1xdpGzosmSyOqmsc+deFAWMnBM/sg=; b=iw2ncsi3ip0pHXoFR/fAwqzRQAOwiQ3gef/+oRSRhAq/5d5jeyoP7BJO81c3zskg6e SkKIGvlIhc+dgXIYqKSjzsyQaG0vejkECk8G9zdWlFI3k/DW1DeAN63CWvY4LnLVgHXS 1JELHT0SplaugwJ321CfssFTj7jWTzF+1FNs6pjG+K0hxM/jfj+EjxZe48TN4nmnxHWv SPQesjkEYYYRot/lhP/gehgPkUDLW/+vLGFjXQURf67z+17KBuXzzI0FGRncaSAk0Dv9 SLglFoWUI0YVn3T1HWVAShsEbg4v3BrOXHfUwEf5B3Ip8tsn0C6psvIa6K/IIGKqSWFX tjGw== X-Gm-Message-State: APt69E1X0n/DjXVk3qFj7pqXfwjCna+Px5H5bHqIOqFyxHSqvujJnYq6 zVygGA5WBppGvVLMw0ksA4Gi7A== X-Google-Smtp-Source: AAOMgpeTCQRhB+WQMbXiw8QQI90XNwkAMsD/SjtlmZIZWYtnBBA6+UOl7w95fT2HK59LzKGq0wZHwA== X-Received: by 2002:a1c:c241:: with SMTP id s62-v6mr1530311wmf.146.1529942410567; Mon, 25 Jun 2018 09:00:10 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: peter.maydell@linaro.org Date: Mon, 25 Jun 2018 17:00:05 +0100 Message-Id: <20180625160009.17437-2-alex.bennee@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180625160009.17437-1-alex.bennee@linaro.org> References: <20180625160009.17437-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PATCH v3 1/5] target/arm: support reading of CNT[VCT|FRQ]_EL0 from user-space X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-arm@nongnu.org, =?UTF-8?q?Alex=20Benn=C3=A9e?= , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Since kernel commit a86bd139f2 (arm64: arch_timer: Enable CNTVCT_EL0 trap..) user-space has been able to read these system registers. As we can't use QEMUTimer's in linux-user mode we just directly call cpu_get_clock(). Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson --- v2 - include CNTFRQ_EL0 for PL0_R only v3 - use NANOSECONDS_PER_SECOND / GTIMER_SCALE --- target/arm/helper.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/target/arm/helper.c b/target/arm/helper.c index 1248d84e6f..6e6b1762e8 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -2166,11 +2166,32 @@ static const ARMCPRegInfo generic_timer_cp_reginfo[= ] =3D { }; =20 #else -/* In user-mode none of the generic timer registers are accessible, - * and their implementation depends on QEMU_CLOCK_VIRTUAL and qdev gpio ou= tputs, - * so instead just don't register any of them. + +/* In user-mode most of the generic timer registers are inaccessible + * however modern kernels (4.12+) allow access to cntvct_el0 */ + +static uint64_t gt_virt_cnt_read(CPUARMState *env, const ARMCPRegInfo *ri) +{ + /* Currently we have no support for QEMUTimer in linux-user so we + * can't call gt_get_countervalue(env), instead we directly + * call the lower level functions. + */ + return cpu_get_clock() / GTIMER_SCALE; +} + static const ARMCPRegInfo generic_timer_cp_reginfo[] =3D { + { .name =3D "CNTFRQ_EL0", .state =3D ARM_CP_STATE_AA64, + .opc0 =3D 3, .opc1 =3D 3, .crn =3D 14, .crm =3D 0, .opc2 =3D 0, + .type =3D ARM_CP_CONST, .access =3D PL0_R /* no PL1_RW in linux-user= */, + .fieldoffset =3D offsetof(CPUARMState, cp15.c14_cntfrq), + .resetvalue =3D NANOSECONDS_PER_SECOND / GTIMER_SCALE, + }, + { .name =3D "CNTVCT_EL0", .state =3D ARM_CP_STATE_AA64, + .opc0 =3D 3, .opc1 =3D 3, .crn =3D 14, .crm =3D 0, .opc2 =3D 2, + .access =3D PL0_R, .type =3D ARM_CP_NO_RAW | ARM_CP_IO, + .readfn =3D gt_virt_cnt_read, + }, REGINFO_SENTINEL }; =20 --=20 2.17.1 From nobody Mon Nov 3 18:05:24 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529942909191150.36813689846713; Mon, 25 Jun 2018 09:08:29 -0700 (PDT) Received: from localhost ([::1]:48053 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXU2W-0002bo-DI for importer@patchew.org; Mon, 25 Jun 2018 12:08:28 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52756) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXTuZ-0004od-9e for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fXTuW-00051b-RP for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:15 -0400 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:46911) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fXTuW-00050l-LH for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:12 -0400 Received: by mail-wr0-x242.google.com with SMTP id l14-v6so9164250wrq.13 for ; Mon, 25 Jun 2018 09:00:12 -0700 (PDT) Received: from zen.linaro.local ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id z14-v6sm14782771wrm.49.2018.06.25.09.00.09 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 25 Jun 2018 09:00:09 -0700 (PDT) Received: from zen.linaroharston (localhost [127.0.0.1]) by zen.linaro.local (Postfix) with ESMTP id 5EB693E08B3; Mon, 25 Jun 2018 17:00:09 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TwXHldywT1MI4fCv7QetLUNUwCIoFxeHYvHSCnIQVqw=; b=BBmxoVMEpptcJck7nSi36q58OTAW1+XWa9FmtZCgT1JegLovrd37L6itrUsXx3Ctgh rTFnJ8OTTA8EmnTtE+h8pMutSpXC41XjLjhYbdBW6duJNNhVUwOMiZ6rj3uwHY9APVie Po+G+plFDrSpEDz4CT1uRdarZH6ska7g7ZQgE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TwXHldywT1MI4fCv7QetLUNUwCIoFxeHYvHSCnIQVqw=; b=G/AjIK9nOKnZzSQLHiPduBW8c8ESPomf7z2v74LdmKhF6m+2WfdswVfjGgtRaRzluf qMho1eZSMjTNQmGlnbL8+SWLp8bvB7ls/xggkJ0jdVwDhySqOsE4xbSTk3TqnmeZwgy4 wQguGGO7272YNMcJw7YZChXBp8Yc9vUX9M0Q8iu5MI3bpbpv64LwG2KST7M4QyDyLK/K PXOC8m7bxTGMhW+hFB4Kgj0yXbSfz6pIBRawntwbgqOXKklW8TqOWJ+2DveFklMJjUpd zSHgx1BPuyolwlmXA/sWsRWwsoQHuXO2lGjd7gjVrrX73BXlGnWuBZpX9BSnjhnECVIy o1SQ== X-Gm-Message-State: APt69E2xDJMAVICyGvnWrXn87VhI1EXM34n2FAIA4heHHaJP5FwtWGf2 TzZMIchflwl9f+Bi6C2YeFjIhg== X-Google-Smtp-Source: AAOMgpcAgRBY3vRXmsGs24NFJZpsDmWVQ9a8Ebeiab5sk2q48Cn/L6MOAEvxHRSEMMa8g4ArFClLbw== X-Received: by 2002:adf:984e:: with SMTP id v72-v6mr823965wrb.180.1529942411362; Mon, 25 Jun 2018 09:00:11 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: peter.maydell@linaro.org Date: Mon, 25 Jun 2018 17:00:06 +0100 Message-Id: <20180625160009.17437-3-alex.bennee@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180625160009.17437-1-alex.bennee@linaro.org> References: <20180625160009.17437-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::242 Subject: [Qemu-devel] [PATCH v3 2/5] target/arm: relax permission checks for HWCAP_CPUID registers X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-arm@nongnu.org, =?UTF-8?q?Alex=20Benn=C3=A9e?= , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Although technically not visible to userspace the kernel does make them visible via trap and emulate. For user mode we can provide the value directly but we need to relax our permission checks to do this. Signed-off-by: Alex Benn=C3=A9e --- target/arm/helper.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/target/arm/helper.c b/target/arm/helper.c index 6e6b1762e8..9d81feb124 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -5813,7 +5813,19 @@ void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu, if (r->state !=3D ARM_CP_STATE_AA32) { int mask =3D 0; switch (r->opc1) { - case 0: case 1: case 2: + case 0: +#ifdef CONFIG_USER_ONLY + /* Some AArch64 CPU ID/feature are exported to userspace + * by the kernel (see HWCAP_CPUID) */ + if (r->opc0 =3D=3D 3 && r->crn =3D=3D 0 && + (r->crm =3D=3D 0 || + (r->crm >=3D 4 && r->crm <=3D 7))) { + mask =3D PL0_R; + break; + } +#endif + /* fall-through */ + case 1: case 2: /* min_EL EL1 */ mask =3D PL1_RW; break; --=20 2.17.1 From nobody Mon Nov 3 18:05:24 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529943007746698.9588935245863; Mon, 25 Jun 2018 09:10:07 -0700 (PDT) Received: from localhost ([::1]:48067 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXU46-00046a-VT for importer@patchew.org; Mon, 25 Jun 2018 12:10:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52904) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXTue-000594-Me for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fXTuY-00052w-Bs for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:20 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:34671) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fXTuY-00051r-2X for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:14 -0400 Received: by mail-wm0-x244.google.com with SMTP id l15-v6so12870413wmc.1 for ; Mon, 25 Jun 2018 09:00:13 -0700 (PDT) Received: from zen.linaro.local ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id l67-v6sm12841639wmb.22.2018.06.25.09.00.09 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 25 Jun 2018 09:00:11 -0700 (PDT) Received: from zen.linaroharston (localhost [127.0.0.1]) by zen.linaro.local (Postfix) with ESMTP id 7277B3E08BB; Mon, 25 Jun 2018 17:00:09 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=L+CkdW7090xExY/8k1283u40u9PL7caTx+GsyIIpY34=; b=Qz6tS6f+YHXESmgV5zWpIt0Uflvre60u516aFmi8/gBa21en0pLzJUn2Zr5fFAUXal 26VXYvfWwGGSwFNO6Ea/H4uQ7oQeFy4+yRE23uTDGqUaglRwAcMiG8paxh4/RTfPAcqZ /Pt/UTxOnGztd8jKvWp9QgYOqKOn8/scGQ6Cc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=L+CkdW7090xExY/8k1283u40u9PL7caTx+GsyIIpY34=; b=WptKY1EwgjwQO3YfVeOQvPZd3xGrKn6cn7FtQT+DXvLZnh87tgzhe7JmPSP2f136Ro z5hDLMspaC0gZVxHfx6WKNfVRXiqdM6ZdQFwTo/TiJXst6V0apZG/us+V2B63gsQD0j/ h+jTXwoVr0b8SGqn410Crx9KPF1x3ZpdP3jRC9XRDB0j21KeTOZeMcNBtjjxyJWNEyMG 2vaVuxYysq/SZ5olehvqz0v8QyBFSbqPps8jdReKOKJ3mdaLoYe4VCYSYQ3nb0af7naz DUydvCBzF7sU78GVXIr8LX0Hz+TKgGrybc53aEExfY1DXEK5Qh9Rxp2TXd37769dMIrk I7rQ== X-Gm-Message-State: APt69E2mbVd4UETIzzM5JsRvicwSsTX2rZ2K5nsYt16SkxG3EuS427ZE xF2OPjssTVymyFfmeB8xEWrl3w== X-Google-Smtp-Source: ADUXVKJwV5hwFBJBIUcNnKMZYoBpLuBLQlrMy/0pGt6noCgDbV+pjnbOVYu4bdtRWCapLymZFCTVXg== X-Received: by 2002:a1c:8cc8:: with SMTP id o191-v6mr1497881wmd.75.1529942412926; Mon, 25 Jun 2018 09:00:12 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: peter.maydell@linaro.org Date: Mon, 25 Jun 2018 17:00:07 +0100 Message-Id: <20180625160009.17437-4-alex.bennee@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180625160009.17437-1-alex.bennee@linaro.org> References: <20180625160009.17437-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PATCH v3 3/5] target/arm: expose CPUID registers to userspace X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-arm@nongnu.org, =?UTF-8?q?Alex=20Benn=C3=A9e?= , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 A number of CPUID registers are exposed to userspace by modern Linux kernels thanks to the "ARM64 CPU Feature Registers" ABI. For CONFIG_USER_ONLY we don't emulate the kernels trap and emulate but instead just lower the read permission to PL0_R (hidden behind the PL1U_R macro). The ID_AA64PFR0_EL1 is a little special as the GIC version is hidden from userspace so we can define a ARM_CP_CONST version of the register for usermode. Signed-off-by: Alex Benn=C3=A9e squash! target/arm: expose CPUID registers to userspace --- target/arm/cpu.h | 7 +++++++ target/arm/helper.c | 39 +++++++++++++++++++++++++-------------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/target/arm/cpu.h b/target/arm/cpu.h index a4507a2d6f..156c811654 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -1924,6 +1924,13 @@ static inline bool cptype_valid(int cptype) #define PL0_R (0x02 | PL1_R) #define PL0_W (0x01 | PL1_W) =20 +/* for AArch64 HWCAP_CPUID to userspace */ +#ifdef CONFIG_USER_ONLY +#define PL1U_R PL0_R +#else +#define PL1U_R PL1_R +#endif + #define PL3_RW (PL3_R | PL3_W) #define PL2_RW (PL2_R | PL2_W) #define PL1_RW (PL1_R | PL1_W) diff --git a/target/arm/helper.c b/target/arm/helper.c index 9d81feb124..1ea0dc4593 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -2987,7 +2987,7 @@ static uint64_t mpidr_read(CPUARMState *env, const AR= MCPRegInfo *ri) static const ARMCPRegInfo mpidr_cp_reginfo[] =3D { { .name =3D "MPIDR", .state =3D ARM_CP_STATE_BOTH, .opc0 =3D 3, .crn =3D 0, .crm =3D 0, .opc1 =3D 0, .opc2 =3D 5, - .access =3D PL1_R, .readfn =3D mpidr_read, .type =3D ARM_CP_NO_RAW }, + .access =3D PL1U_R, .readfn =3D mpidr_read, .type =3D ARM_CP_NO_RAW = }, REGINFO_SENTINEL }; =20 @@ -4776,6 +4776,7 @@ static uint64_t id_pfr1_read(CPUARMState *env, const = ARMCPRegInfo *ri) return pfr1; } =20 +#ifndef CONFIG_USER_ONLY static uint64_t id_aa64pfr0_read(CPUARMState *env, const ARMCPRegInfo *ri) { ARMCPU *cpu =3D arm_env_get_cpu(env); @@ -4786,6 +4787,7 @@ static uint64_t id_aa64pfr0_read(CPUARMState *env, co= nst ARMCPRegInfo *ri) } return pfr0; } +#endif =20 void register_cp_regs_for_features(ARMCPU *cpu) { @@ -4934,18 +4936,26 @@ void register_cp_regs_for_features(ARMCPU *cpu) * define new registers here. */ ARMCPRegInfo v8_idregs[] =3D { - /* ID_AA64PFR0_EL1 is not a plain ARM_CP_CONST because we don't - * know the right value for the GIC field until after we - * define these regs. + /* ID_AA64PFR0_EL1 is not a plain ARM_CP_CONST for system + * emulation because we don't know the right value for the + * GIC field until after we define these regs. For + * user-mode HWCAP_CPUID emulation the gic bits are masked + * anyway. */ { .name =3D "ID_AA64PFR0_EL1", .state =3D ARM_CP_STATE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 4, .opc2 =3D = 0, +#ifndef CONFIG_USER_ONLY .access =3D PL1_R, .type =3D ARM_CP_NO_RAW, .readfn =3D id_aa64pfr0_read, - .writefn =3D arm_cp_write_ignore }, + .writefn =3D arm_cp_write_ignore +#else + .access =3D PL0_R, .type =3D ARM_CP_CONST, + .resetvalue =3D cpu->id_aa64pfr0 +#endif + }, { .name =3D "ID_AA64PFR1_EL1", .state =3D ARM_CP_STATE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 4, .opc2 =3D = 1, - .access =3D PL1_R, .type =3D ARM_CP_CONST, + .access =3D PL1U_R, .type =3D ARM_CP_CONST, .resetvalue =3D cpu->id_aa64pfr1}, { .name =3D "ID_AA64PFR2_EL1_RESERVED", .state =3D ARM_CP_STAT= E_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 4, .opc2 =3D = 2, @@ -4973,11 +4983,11 @@ void register_cp_regs_for_features(ARMCPU *cpu) .resetvalue =3D 0 }, { .name =3D "ID_AA64DFR0_EL1", .state =3D ARM_CP_STATE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 5, .opc2 =3D = 0, - .access =3D PL1_R, .type =3D ARM_CP_CONST, + .access =3D PL1U_R, .type =3D ARM_CP_CONST, .resetvalue =3D cpu->id_aa64dfr0 }, { .name =3D "ID_AA64DFR1_EL1", .state =3D ARM_CP_STATE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 5, .opc2 =3D = 1, - .access =3D PL1_R, .type =3D ARM_CP_CONST, + .access =3D PL1U_R, .type =3D ARM_CP_CONST, .resetvalue =3D cpu->id_aa64dfr1 }, { .name =3D "ID_AA64DFR2_EL1_RESERVED", .state =3D ARM_CP_STAT= E_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 5, .opc2 =3D = 2, @@ -5005,11 +5015,11 @@ void register_cp_regs_for_features(ARMCPU *cpu) .resetvalue =3D 0 }, { .name =3D "ID_AA64ISAR0_EL1", .state =3D ARM_CP_STATE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 6, .opc2 =3D = 0, - .access =3D PL1_R, .type =3D ARM_CP_CONST, + .access =3D PL1U_R, .type =3D ARM_CP_CONST, .resetvalue =3D cpu->id_aa64isar0 }, { .name =3D "ID_AA64ISAR1_EL1", .state =3D ARM_CP_STATE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 6, .opc2 =3D = 1, - .access =3D PL1_R, .type =3D ARM_CP_CONST, + .access =3D PL1U_R, .type =3D ARM_CP_CONST, .resetvalue =3D cpu->id_aa64isar1 }, { .name =3D "ID_AA64ISAR2_EL1_RESERVED", .state =3D ARM_CP_STA= TE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 6, .opc2 =3D = 2, @@ -5037,11 +5047,11 @@ void register_cp_regs_for_features(ARMCPU *cpu) .resetvalue =3D 0 }, { .name =3D "ID_AA64MMFR0_EL1", .state =3D ARM_CP_STATE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 7, .opc2 =3D = 0, - .access =3D PL1_R, .type =3D ARM_CP_CONST, + .access =3D PL1U_R, .type =3D ARM_CP_CONST, .resetvalue =3D cpu->id_aa64mmfr0 }, { .name =3D "ID_AA64MMFR1_EL1", .state =3D ARM_CP_STATE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 7, .opc2 =3D = 1, - .access =3D PL1_R, .type =3D ARM_CP_CONST, + .access =3D PL1U_R, .type =3D ARM_CP_CONST, .resetvalue =3D cpu->id_aa64mmfr1 }, { .name =3D "ID_AA64MMFR2_EL1_RESERVED", .state =3D ARM_CP_STA= TE_AA64, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 7, .opc2 =3D = 2, @@ -5335,7 +5345,7 @@ void register_cp_regs_for_features(ARMCPU *cpu) ARMCPRegInfo id_v8_midr_cp_reginfo[] =3D { { .name =3D "MIDR_EL1", .state =3D ARM_CP_STATE_BOTH, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 0, .opc2 =3D = 0, - .access =3D PL1_R, .type =3D ARM_CP_NO_RAW, .resetvalue =3D = cpu->midr, + .access =3D PL1U_R, .type =3D ARM_CP_NO_RAW, .resetvalue =3D= cpu->midr, .fieldoffset =3D offsetof(CPUARMState, cp15.c0_cpuid), .readfn =3D midr_read }, /* crn =3D 0 op1 =3D 0 crm =3D 0 op2 =3D 4,7 : AArch32 aliases= of MIDR */ @@ -5347,7 +5357,8 @@ void register_cp_regs_for_features(ARMCPU *cpu) .access =3D PL1_R, .resetvalue =3D cpu->midr }, { .name =3D "REVIDR_EL1", .state =3D ARM_CP_STATE_BOTH, .opc0 =3D 3, .opc1 =3D 0, .crn =3D 0, .crm =3D 0, .opc2 =3D = 6, - .access =3D PL1_R, .type =3D ARM_CP_CONST, .resetvalue =3D c= pu->revidr }, + .access =3D PL1U_R, .type =3D ARM_CP_CONST, + .resetvalue =3D cpu->revidr }, REGINFO_SENTINEL }; ARMCPRegInfo id_cp_reginfo[] =3D { --=20 2.17.1 From nobody Mon Nov 3 18:05:24 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 152994261611255.38565613329183; Mon, 25 Jun 2018 09:03:36 -0700 (PDT) Received: from localhost ([::1]:47994 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXTxn-0007MW-9O for importer@patchew.org; Mon, 25 Jun 2018 12:03:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52786) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXTuZ-0004rb-Qa for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fXTuY-00053W-Uv for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:15 -0400 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:44879) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fXTuY-00052k-OQ for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:14 -0400 Received: by mail-wr0-x242.google.com with SMTP id p12-v6so12598256wrn.11 for ; Mon, 25 Jun 2018 09:00:14 -0700 (PDT) Received: from zen.linaro.local ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id b190-v6sm11643409wma.24.2018.06.25.09.00.09 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 25 Jun 2018 09:00:11 -0700 (PDT) Received: from zen.linaroharston (localhost [127.0.0.1]) by zen.linaro.local (Postfix) with ESMTP id 850133E08C1; Mon, 25 Jun 2018 17:00:09 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hm3Fkdmmw8AA74rWW5Mzc1mQoDPxN/Jepa0l5eggUDY=; b=HRTnKFIH3kEwi4+bEi8nH4yI/3qCjB6UrKvcW5h4e1lL4nYvghOa+zcVv6OvJYwA9F Zx9aZ29//u7+scNnBNHsfMAdP/LVk8aXSzDTZFGP234QNbxCOQ53e4wJDCc9FVqhDgbi Oy0y7gOfY7RYdKOqLFGn4khflXpY4WH8+k+po= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hm3Fkdmmw8AA74rWW5Mzc1mQoDPxN/Jepa0l5eggUDY=; b=uc45ld1EnYQ3Btuqy+SCJVB6LF15PnWgDMrJb6B67sHB+X51c3NO4LTFS3O1VSwzXX sBlbidRoJJTC3W0wf92oqMybIudFcQH0oqtqohifzuxlOxy62sx/tNA3V+JvNLn7LutX RNczJCcLrHzunOItYZPXJ3Og1NhOa1Bxl+0nOBRbd1Za5/Og6Z8vyBg/mU/zONZLZkzJ 6eA790EU93tilmMzJKsIJIuBEANVZ2QWxE9y0ZpJvJ9Z0dojAqMinkqpf8jHtVxfJ9tO cLYh0kJNv1eLBzyb64IYYT9QbIFruMDyseoLIo9Cf27yVQyBi+g1CVnTrG2bizNNpLmF gaNQ== X-Gm-Message-State: APt69E0cVng5kJSlpbbsUdYb1fcFObc4vnybhX2OHOqmRYIcHrnG4vNN T04XTzU6lAUhLA5OKpD92ocwlraBPp8= X-Google-Smtp-Source: AAOMgpdHcAMigVAnwB7AbJnrJ/TuH+Z1mrrNuYFSw78kgQ7oUBGRZm21u63UmRisPUeLo69xAKZ1zQ== X-Received: by 2002:adf:afd3:: with SMTP id y19-v6mr2219720wrd.176.1529942413660; Mon, 25 Jun 2018 09:00:13 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: peter.maydell@linaro.org Date: Mon, 25 Jun 2018 17:00:08 +0100 Message-Id: <20180625160009.17437-5-alex.bennee@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180625160009.17437-1-alex.bennee@linaro.org> References: <20180625160009.17437-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::242 Subject: [Qemu-devel] [PATCH v3 4/5] linux-user/elfload: enable HWCAP_CPUID for AArch64 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Riku Voipio , qemu-arm@nongnu.org, =?UTF-8?q?Alex=20Benn=C3=A9e?= , qemu-devel@nongnu.org, Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Userspace programs should (in theory) query the ELF HWCAP before probing these registers. Now we have implemented them all make it public. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson --- linux-user/elfload.c | 1 + 1 file changed, 1 insertion(+) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 13bc78d0c8..76d7674649 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -566,6 +566,7 @@ static uint32_t get_elf_hwcap(void) =20 hwcaps |=3D ARM_HWCAP_A64_FP; hwcaps |=3D ARM_HWCAP_A64_ASIMD; + hwcaps |=3D ARM_HWCAP_A64_CPUID; =20 /* probe for the extra features */ #define GET_FEATURE(feat, hwcap) \ --=20 2.17.1 From nobody Mon Nov 3 18:05:24 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529942811260186.78649862972043; Mon, 25 Jun 2018 09:06:51 -0700 (PDT) Received: from localhost ([::1]:48033 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXU0r-0001MF-7F for importer@patchew.org; Mon, 25 Jun 2018 12:06:45 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52851) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXTub-0004yp-NM for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fXTua-00055E-Gg for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:17 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:38673) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fXTua-000548-A2 for qemu-devel@nongnu.org; Mon, 25 Jun 2018 12:00:16 -0400 Received: by mail-wm0-x241.google.com with SMTP id 69-v6so10601310wmf.3 for ; Mon, 25 Jun 2018 09:00:16 -0700 (PDT) Received: from zen.linaro.local ([81.128.185.34]) by smtp.gmail.com with ESMTPSA id a9-v6sm12494479wmh.38.2018.06.25.09.00.10 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 25 Jun 2018 09:00:12 -0700 (PDT) Received: from zen.linaroharston (localhost [127.0.0.1]) by zen.linaro.local (Postfix) with ESMTP id 99D6E3E08E5; Mon, 25 Jun 2018 17:00:09 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wvvefg7SIN2MnLMPoNxKILPy8nFjsmp3rK/nOlMAARw=; b=aFqFkmhrxA/evWFvhHeb9/z1tCAfvGS3uhMYtVo16y+Qi4zZYx+Pi1CmFLvuMerWHh 6OqYpGl/gITolD0tEGRHC88lPu6f/kFG72tIswl9oCb1o7jwyVhkVrise6uTwoIjhSts 9oHG0pXnbVUUKw4lduhsqzWc7LmmE+MR2iRUo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wvvefg7SIN2MnLMPoNxKILPy8nFjsmp3rK/nOlMAARw=; b=llW7MtpVgfVYzv8omXnZyyqcx+HxLA/JxXT8C+E3xO8Ca9hu4jJF1x8sMyKCiQhXkB AW4VOtHkfnFR8ta9cjFnW/QdCzAWHzx4WakYP97GOFPjFf7uA9E/8WiNP1ZJFeAVGJl9 BU0u4bn7y/lfOQvobOjiBAaPMjw/h7uMuDhgQdnlKIbN0NtNhGahI7K+RK+5+mIReBB0 77YL75FRmm1SIDCxYLqsmlltI6d0UPaXfFl02NXlKtsxWHN7uUfbRO5OQKc1JJRACEpN oEqyjLamwvNPd77HvtFUt7nDTcC4YwBr244LQq78G71F42ISxYPT5I2RH9DN0xrDh3SX /dDQ== X-Gm-Message-State: APt69E0c9+YYgDtgjc5F0iW/7IWO1FhPvn4cQMw/8C7h/p6DNK739bZR qdvLovYotHtaSWUIvrw1X/VFaw== X-Google-Smtp-Source: AAOMgpe0hvZ8BW6Qbw98Ttu8rLiLfjeTgJTEB4DFuA+U5xI27wjhZPby6aqLxjEjmjr/jqtYa0bQ2g== X-Received: by 2002:a1c:8c55:: with SMTP id o82-v6mr1420668wmd.60.1529942415020; Mon, 25 Jun 2018 09:00:15 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: peter.maydell@linaro.org Date: Mon, 25 Jun 2018 17:00:09 +0100 Message-Id: <20180625160009.17437-6-alex.bennee@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180625160009.17437-1-alex.bennee@linaro.org> References: <20180625160009.17437-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PATCH v3 5/5] tests/tcg/aarch64: userspace system register test X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-arm@nongnu.org, =?UTF-8?q?Alex=20Benn=C3=A9e?= , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 This tests a bunch of registers that the kernel allows userspace to read including the CPUID registers. Signed-off-by: Alex Benn=C3=A9e Reviewed-by: Richard Henderson --- tests/tcg/aarch64/Makefile.target | 2 +- tests/tcg/aarch64/sysregs.c | 99 +++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 tests/tcg/aarch64/sysregs.c diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile= .target index 08c45b8470..cc1a7eb486 100644 --- a/tests/tcg/aarch64/Makefile.target +++ b/tests/tcg/aarch64/Makefile.target @@ -7,7 +7,7 @@ VPATH +=3D $(AARCH64_SRC) =20 # we don't build any of the ARM tests AARCH64_TESTS=3D$(filter-out $(ARM_TESTS), $(TESTS)) -AARCH64_TESTS+=3Dfcvt +AARCH64_TESTS+=3Dfcvt sysregs TESTS:=3D$(AARCH64_TESTS) =20 fcvt: LDFLAGS+=3D-lm diff --git a/tests/tcg/aarch64/sysregs.c b/tests/tcg/aarch64/sysregs.c new file mode 100644 index 0000000000..177d1fe33b --- /dev/null +++ b/tests/tcg/aarch64/sysregs.c @@ -0,0 +1,99 @@ +/* + * Check emulated system register access for linux-user mode. + * + * See: https://www.kernel.org/doc/Documentation/arm64/cpu-feature-registe= rs.txt + */ + +#include +#include +#include +#include +#include +#include + +#define get_cpu_reg(id) ({ \ + unsigned long __val =3D 0xdeadbeef; \ + asm("mrs %0, "#id : "=3Dr" (__val)); \ + printf("%-20s: 0x%016lx\n", #id, __val); \ + }) + +bool should_fail; + +int should_fail_count; +int should_not_fail_count; +uintptr_t failed_pc[10]; + +void sigill_handler(int signo, siginfo_t *si, void *data) +{ + ucontext_t *uc =3D (ucontext_t *)data; + + if (should_fail) { + should_fail_count++; + } else { + uintptr_t pc =3D (uintptr_t) uc->uc_mcontext.pc; + failed_pc[should_not_fail_count++] =3D pc; + } + uc->uc_mcontext.pc +=3D 4; +} + +int main(void) +{ + struct sigaction sa; + + /* Hook in a SIGILL handler */ + memset(&sa, 0, sizeof(struct sigaction)); + sa.sa_flags =3D SA_SIGINFO; + sa.sa_sigaction =3D &sigill_handler; + sigemptyset(&sa.sa_mask); + + if (sigaction(SIGILL, &sa, 0) !=3D 0) { + perror("sigaction"); + return 1; + } + + /* since 4.12 */ + printf("Checking CNT registers\n"); + + get_cpu_reg(ctr_el0); + get_cpu_reg(cntvct_el0); + get_cpu_reg(cntfrq_el0); + + /* when (getauxval(AT_HWCAP) & HWCAP_CPUID), since 4.11*/ + if (!(getauxval(AT_HWCAP) & HWCAP_CPUID)) { + printf("CPUID registers unavailable\n"); + return 1; + } else { + printf("Checking CPUID registers\n"); + } + + get_cpu_reg(id_aa64isar0_el1); + get_cpu_reg(id_aa64isar1_el1); + get_cpu_reg(id_aa64mmfr0_el1); + get_cpu_reg(id_aa64mmfr1_el1); + get_cpu_reg(id_aa64pfr0_el1); + get_cpu_reg(id_aa64pfr1_el1); + get_cpu_reg(id_aa64dfr0_el1); + get_cpu_reg(id_aa64dfr1_el1); + + get_cpu_reg(midr_el1); + get_cpu_reg(mpidr_el1); + get_cpu_reg(revidr_el1); + + printf("Remaining registers should fail\n"); + should_fail =3D true; + + /* Unexposed register access causes SIGILL */ + get_cpu_reg(id_mmfr0_el1); + + if (should_not_fail_count > 0) { + int i; + for (i =3D 0; i < should_not_fail_count; i++) { + uintptr_t pc =3D failed_pc[i]; + uint32_t insn =3D *(uint32_t *) pc; + printf("insn %#x @ %#lx unexpected FAIL\n", insn, pc); + } + return 1; + } + + return should_fail_count =3D=3D 1 ? 0 : 1; +} --=20 2.17.1