From nobody Tue Nov 26 18:40:14 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1704882472; cv=none; d=zohomail.com; s=zohoarc; b=WX23y1yv2t4cRrXsnzZrxkMoFm+dj6jvSo8AIlV1jzTzR8xkyLPkmSsO7uBjxaT78QaVekKEQRrr6JjG24DdGDM2JgqM6IsNhi06SLYsAVB+I7IDIoGMvUNlK2eL2XelpFOAL0S5Dv2hFUwVg/xK5krEO/ZMzzHm7fthMb2vvSg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1704882472; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=dzN3+jXhb8GvLRhT3tsBTDoejabXkRcegOYBF28Br58=; b=XCBUMLKyUnUXz3tZFB1VSlfOIzs91pYM5A20ZbhQLutSXtkc1tbLglGw6Xfg9imiNjUY19rvyIF7A9JAK2jylHiJOCMYy4e8oDr0rYHpkh0mwHP4GhacYNb2M0HlN/wgK5YxmWdOcdB6AH3wv7uEQG4H32Pa0d2nA45h7BgEu+8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1704882472283200.2697276528702; Wed, 10 Jan 2024 02:27:52 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rNVnI-0001Vn-RH; Wed, 10 Jan 2024 05:26:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rNVn9-0001SN-R0; Wed, 10 Jan 2024 05:26:36 -0500 Received: from ams.source.kernel.org ([145.40.68.75]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rNVn5-0002Ac-VN; Wed, 10 Jan 2024 05:26:34 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by ams.source.kernel.org (Postfix) with ESMTP id C6AD7B81CEE; Wed, 10 Jan 2024 10:26:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id F223FC433F1; Wed, 10 Jan 2024 10:26:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1704882379; bh=MHnWxdBgsPkLhB8O457v8UhLxlVOUR8IOe/2YdhJE00=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Jyl0qPVVfRZOfK5/IcE74gpBnl1EDHxgjFLDxYdcb65A3Tzo+n6ukObdvfJSnmZDl 0Z6I+QZaDt9XH1bthoStDH6divm9o6AjFLZOx30nJnZ3Wi/HWWtFW8NBVA4O+cuJEU C5D+9gkWEjcsGqHU2AHklgxF8P3xcHGwnNxAC50cTLkkMxFLWUk682OkZVw3UDzKpl MeztL9a3neUAxo3Qqg0L97bwpHhzb3CvWGq4McYZo3zV/DveVzgHLooRMXJcIBzt1K O1g37m/vSfr2/gwpE3VdmH/9CZ8D6p6jZ90l4cTT7skalQifgWeUW6yfJh4c+yZR8U zS/ohunxhecDw== From: Conor Dooley To: qemu-riscv@nongnu.org Cc: conor@kernel.org, Conor Dooley , Alistair Francis , Bin Meng , Palmer Dabbelt , Weiwei Li , Daniel Henrique Barboza , Andrew Jones , Liu Zhiwei , qemu-devel@nongnu.org Subject: [PATCH v3 1/2] target/riscv: use misa_mxl_max to populate isa string rather than TARGET_LONG_BITS Date: Wed, 10 Jan 2024 10:25:36 +0000 Message-Id: <20240110-eastward-sulfide-f365c89681e0@spud> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240110-mold-renovate-256db1b5c70e@spud> References: <20240110-mold-renovate-256db1b5c70e@spud> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1328; i=conor.dooley@microchip.com; h=from:subject:message-id; bh=eMHp4WF8kiaDPOpXOfMcqHM5QHTMhiMLE5l3zLH2AEw=; b=owGbwMvMwCFWscWwfUFT0iXG02pJDKnzCubtlD7jJ8V40euRfNLEf3rvMm7b9cb3hu4xzhLe4 fzjwIEJHaUsDGIcDLJiiiyJt/tapNb/cdnh3PMWZg4rE8gQBi5OAbjIKob/AS/mTt8tFjtbaMW3 Zw+OMMzgDt7hu//GhvMeDnYrX/Hek2ZkeKUX0MFs+8Sl9en//1uL/Bu/nqw7ITdPgGdVfNIFJfM vPAA= X-Developer-Key: i=conor.dooley@microchip.com; a=openpgp; fpr=F9ECA03CF54F12CD01F1655722E2C55B37CF380C Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=145.40.68.75; envelope-from=conor@kernel.org; helo=ams.source.kernel.org X-Spam_score_int: -68 X-Spam_score: -6.9 X-Spam_bar: ------ X-Spam_report: (-6.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.493, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @kernel.org) X-ZM-MESSAGEID: 1704882473957100003 Content-Type: text/plain; charset="utf-8" From: Conor Dooley A cpu may not have the same xlen as the compile time target, and misa_mxl_max is the source of truth for what the hart supports. Reported-by: Andrew Jones Link: https://lore.kernel.org/qemu-riscv/20240108-efa3f83dcd3997dc0af458d7@= orel/ Signed-off-by: Conor Dooley Reviewed-by: Alistair Francis Reviewed-by: Andrew Jones --- Perhaps this misa_mxl_max -> width conversion should exist as a macro? There's now 3 individual conversions of this type - two I added and one in the gdb code. --- target/riscv/cpu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 8cbfc7e781..5b5da970f2 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -1860,7 +1860,9 @@ char *riscv_isa_string(RISCVCPU *cpu) int i; const size_t maxlen =3D sizeof("rv128") + sizeof(riscv_single_letter_e= xts); char *isa_str =3D g_new(char, maxlen); - char *p =3D isa_str + snprintf(isa_str, maxlen, "rv%d", TARGET_LONG_BI= TS); + int xlen =3D 16 << cpu->env.misa_mxl_max; + char *p =3D isa_str + snprintf(isa_str, maxlen, "rv%d", xlen); + for (i =3D 0; i < sizeof(riscv_single_letter_exts) - 1; i++) { if (cpu->env.misa_ext & RV(riscv_single_letter_exts[i])) { *p++ =3D qemu_tolower(riscv_single_letter_exts[i]); --=20 2.39.2 From nobody Tue Nov 26 18:40:14 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1704882443; cv=none; d=zohomail.com; s=zohoarc; b=fuVuCEIp4IDI6gOj6nAjBRYQj4+FMYZDMydDn49zOm/H4kIkZ5iTFhyiadQ/Cwjv1nVbTEha1Ae3jprnjvpk0nEo86uorAUBjQAhaVlbgFAmJy5s2yP+G0zre3uqIlIxJD3jlZoQT++cGErv5oZPsM1Pkam4VHuL2IfVxEDypMo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1704882443; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=gbcdcbYr4v4pw5kBuQNlMVYj+BJKFLOFgyoBN0V9Ks0=; b=IuLENl9uLBN31VExondLGWFho9/hz/YHSedbYT0ERxdCoq63Oi9I+mEKMEPKnxERIkPs3kRJUZwgO3kLtVzMNl7L0KleeuZQsWQbLQpWPXIBnbb3mvxYLTTee5fb0f36xKy4sfVVc6kCnqx3mAOzliOacWSVZiBVE0LNMVJuUNg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1704882443076211.15845020439633; Wed, 10 Jan 2024 02:27:23 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rNVnF-0001UN-Cv; Wed, 10 Jan 2024 05:26:41 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rNVnB-0001TK-6K; Wed, 10 Jan 2024 05:26:37 -0500 Received: from ams.source.kernel.org ([2604:1380:4601:e00::1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rNVn2-0002D8-E3; Wed, 10 Jan 2024 05:26:36 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by ams.source.kernel.org (Postfix) with ESMTP id 35D27B81D39; Wed, 10 Jan 2024 10:26:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 61258C433C7; Wed, 10 Jan 2024 10:26:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1704882382; bh=uPSJ912E61NbL3SdyNp468Rm4sZc7AW7SrhxoDRUMQI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=W3xsss4hqo9INtOd534kPBiu1MD1d5vdtxCFziKW0BR6y9Ve/ofmshkGy9LqLNvta 4Qb56CetnKKBnG+LE5pZUUXqrJ9l+jsC1PLwdsP3J+XWv6agSF+Dt8hKkhWoj43sXh 4o+NGxvd2K9onZORVd8hzZ+XkDCk0vD3N9BBpBkANq/XE+G8kpWJra+vxtk+1L35qo 8zwf0IvZMoXwh8BunomqBkiU7rMjOlGgy7RAWMi/dq+d++kmBcV3PBf81lwB2HQmB6 UydLWRh4z5vKjCoEg2Ypt4Rmwe3EMFpcnDpBmxYHH8C6DWCyWOFYVp2z9njlSknlHG fI64ZO7Ec7x3g== From: Conor Dooley To: qemu-riscv@nongnu.org Cc: conor@kernel.org, Conor Dooley , Alistair Francis , Bin Meng , Palmer Dabbelt , Weiwei Li , Daniel Henrique Barboza , Andrew Jones , Liu Zhiwei , qemu-devel@nongnu.org Subject: [PATCH v3 2/2] target/riscv: support new isa extension detection devicetree properties Date: Wed, 10 Jan 2024 10:25:37 +0000 Message-Id: <20240110-sasquatch-vaporizer-b1d92e7ea9dc@spud> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240110-mold-renovate-256db1b5c70e@spud> References: <20240110-mold-renovate-256db1b5c70e@spud> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=9231; i=conor.dooley@microchip.com; h=from:subject:message-id; bh=LxX43HW+Y5e5cnoGrSoLBUm1B7Y77YwtssNL3z2KIuk=; b=owGbwMvMwCFWscWwfUFT0iXG02pJDKnzCubNfSz3izXuoOFO1/98GToPFFSswndszwvO6vtqc Fz/YsjkjlIWBjEOBlkxRZbE230tUuv/uOxw7nkLM4eVCWQIAxenAExkVzcjw3PFAyc3M920d5z4 w+DoFQamD1eez3/4kk/G8o6BZomr2T+G/zG3n05xMv6YaeCakcbC6MygfiS2gDFzR998Hd59Z7c rsQMA X-Developer-Key: i=conor.dooley@microchip.com; a=openpgp; fpr=F9ECA03CF54F12CD01F1655722E2C55B37CF380C Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2604:1380:4601:e00::1; envelope-from=conor@kernel.org; helo=ams.source.kernel.org X-Spam_score_int: -68 X-Spam_score: -6.9 X-Spam_bar: ------ X-Spam_report: (-6.9 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-2.493, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @kernel.org) X-ZM-MESSAGEID: 1704882444372100001 Content-Type: text/plain; charset="utf-8" From: Conor Dooley A few months ago I submitted a patch to various lists, deprecating "riscv,isa" with a lengthy commit message [0] that is now commit aeb71e42caae ("dt-bindings: riscv: deprecate riscv,isa") in the Linux kernel tree. Primarily, the goal was to replace "riscv,isa" with a new set of properties that allowed for strictly defining the meaning of various extensions, where "riscv,isa" was tied to whatever definitions inflicted upon us by the ISA manual, which have seen some variance over time. Two new properties were introduced: "riscv,isa-base" and "riscv,isa-extensions". The former is a simple string to communicate the base ISA implemented by a hart and the latter an array of strings used to communicate the set of ISA extensions supported, per the definitions of each substring in extensions.yaml [1]. A beneficial side effect was also the ability to define vendor extensions in a more "official" way, as the ISA manual and other RVI specifications only covered the format for vendor extensions in the ISA string, but not the meaning of vendor extensions, for obvious reasons. Add support for setting these two new properties in the devicetrees for the various devicetree platforms supported by QEMU for RISC-V. The Linux kernel already supports parsing ISA extensions from these new properties, and documenting them in the dt-binding is a requirement for new extension detection being added to the kernel. A side effect of the implementation is that the meaning for elements in "riscv,isa" and in "riscv,isa-extensions" are now tied together as they are constructed from the same source. The same applies to the ISA string provided in ACPI tables, but there does not appear to be any strict definitions of meanings in ACPI land either. Link: https://lore.kernel.org/qemu-riscv/20230702-eats-scorebook-c951f170d2= 9f@spud/ [0] Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tr= ee/Documentation/devicetree/bindings/riscv/extensions.yaml [1] Signed-off-by: Conor Dooley Reviewed-by: Alistair Francis Reviewed-by: Andrew Jones --- hw/riscv/sifive_u.c | 7 ++---- hw/riscv/spike.c | 6 ++--- hw/riscv/virt.c | 6 ++--- target/riscv/cpu.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ target/riscv/cpu.h | 1 + 5 files changed, 60 insertions(+), 13 deletions(-) diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index ec76dce6c9..2f227f15bc 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -171,7 +171,6 @@ static void create_fdt(SiFiveUState *s, const MemMapEnt= ry *memmap, int cpu_phandle =3D phandle++; nodename =3D g_strdup_printf("/cpus/cpu@%d", cpu); char *intc =3D g_strdup_printf("/cpus/cpu@%d/interrupt-controller"= , cpu); - char *isa; qemu_fdt_add_subnode(fdt, nodename); /* cpu 0 is the management hart that does not have mmu */ if (cpu !=3D 0) { @@ -180,11 +179,10 @@ static void create_fdt(SiFiveUState *s, const MemMapE= ntry *memmap, } else { qemu_fdt_setprop_string(fdt, nodename, "mmu-type", "riscv,= sv48"); } - isa =3D riscv_isa_string(&s->soc.u_cpus.harts[cpu - 1]); + riscv_isa_write_fdt(&s->soc.u_cpus.harts[cpu - 1], fdt, nodena= me); } else { - isa =3D riscv_isa_string(&s->soc.e_cpus.harts[0]); + riscv_isa_write_fdt(&s->soc.e_cpus.harts[0], fdt, nodename); } - qemu_fdt_setprop_string(fdt, nodename, "riscv,isa", isa); qemu_fdt_setprop_string(fdt, nodename, "compatible", "riscv"); qemu_fdt_setprop_string(fdt, nodename, "status", "okay"); qemu_fdt_setprop_cell(fdt, nodename, "reg", cpu); @@ -194,7 +192,6 @@ static void create_fdt(SiFiveUState *s, const MemMapEnt= ry *memmap, qemu_fdt_setprop_string(fdt, intc, "compatible", "riscv,cpu-intc"); qemu_fdt_setprop(fdt, intc, "interrupt-controller", NULL, 0); qemu_fdt_setprop_cell(fdt, intc, "#interrupt-cells", 1); - g_free(isa); g_free(intc); g_free(nodename); } diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c index 81f7e53aed..64074395bc 100644 --- a/hw/riscv/spike.c +++ b/hw/riscv/spike.c @@ -59,7 +59,7 @@ static void create_fdt(SpikeState *s, const MemMapEntry *= memmap, MachineState *ms =3D MACHINE(s); uint32_t *clint_cells; uint32_t cpu_phandle, intc_phandle, phandle =3D 1; - char *name, *mem_name, *clint_name, *clust_name; + char *mem_name, *clint_name, *clust_name; char *core_name, *cpu_name, *intc_name; static const char * const clint_compat[2] =3D { "sifive,clint0", "riscv,clint0" @@ -113,9 +113,7 @@ static void create_fdt(SpikeState *s, const MemMapEntry= *memmap, } else { qemu_fdt_setprop_string(fdt, cpu_name, "mmu-type", "riscv,= sv48"); } - name =3D riscv_isa_string(&s->soc[socket].harts[cpu]); - qemu_fdt_setprop_string(fdt, cpu_name, "riscv,isa", name); - g_free(name); + riscv_isa_write_fdt(&s->soc[socket].harts[cpu], fdt, cpu_name); qemu_fdt_setprop_string(fdt, cpu_name, "compatible", "riscv"); qemu_fdt_setprop_string(fdt, cpu_name, "status", "okay"); qemu_fdt_setprop_cell(fdt, cpu_name, "reg", diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index f9fd1341fc..c47b2d397a 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -215,7 +215,7 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, i= nt socket, int cpu; uint32_t cpu_phandle; MachineState *ms =3D MACHINE(s); - char *name, *cpu_name, *core_name, *intc_name, *sv_name; + char *cpu_name, *core_name, *intc_name, *sv_name; bool is_32_bit =3D riscv_is_32bit(&s->soc[0]); uint8_t satp_mode_max; =20 @@ -236,9 +236,7 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, i= nt socket, g_free(sv_name); } =20 - name =3D riscv_isa_string(cpu_ptr); - qemu_fdt_setprop_string(ms->fdt, cpu_name, "riscv,isa", name); - g_free(name); + riscv_isa_write_fdt(cpu_ptr, ms->fdt, cpu_name); =20 if (cpu_ptr->cfg.ext_zicbom) { qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cbom-block-siz= e", diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 5b5da970f2..1c8c81ca4c 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -31,6 +31,7 @@ #include "hw/qdev-properties.h" #include "migration/vmstate.h" #include "fpu/softfloat-helpers.h" +#include "sysemu/device_tree.h" #include "sysemu/kvm.h" #include "sysemu/tcg.h" #include "kvm/kvm_riscv.h" @@ -1875,6 +1876,58 @@ char *riscv_isa_string(RISCVCPU *cpu) return isa_str; } =20 +#ifndef CONFIG_USER_ONLY +static char **riscv_isa_extensions_list(RISCVCPU *cpu, int *count) +{ + int maxlen =3D ARRAY_SIZE(riscv_single_letter_exts) + ARRAY_SIZE(isa_e= data_arr); + char **extensions =3D g_new(char *, maxlen); + + for (int i =3D 0; i < sizeof(riscv_single_letter_exts) - 1; i++) { + if (cpu->env.misa_ext & RV(riscv_single_letter_exts[i])) { + extensions[*count] =3D g_new(char, 2); + snprintf(extensions[*count], 2, "%c", + qemu_tolower(riscv_single_letter_exts[i])); + (*count)++; + } + } + + for (const RISCVIsaExtData *edata =3D isa_edata_arr; edata->name; edat= a++) { + if (isa_ext_is_enabled(cpu, edata->ext_enable_offset)) { + extensions[*count] =3D g_strdup(edata->name); + (*count)++; + } + } + + return extensions; +} + +void riscv_isa_write_fdt(RISCVCPU *cpu, void *fdt, char *nodename) +{ + const size_t maxlen =3D sizeof("rv128i"); + g_autofree char *isa_base =3D g_new(char, maxlen); + g_autofree char *riscv_isa; + char **isa_extensions; + int count =3D 0; + int xlen =3D 16 << cpu->env.misa_mxl_max; + + riscv_isa =3D riscv_isa_string(cpu); + qemu_fdt_setprop_string(fdt, nodename, "riscv,isa", riscv_isa); + + snprintf(isa_base, maxlen, "rv%di", xlen); + qemu_fdt_setprop_string(fdt, nodename, "riscv,isa-base", isa_base); + + isa_extensions =3D riscv_isa_extensions_list(cpu, &count); + qemu_fdt_setprop_string_array(fdt, nodename, "riscv,isa-extensions", + isa_extensions, count); + + for (int i =3D 0; i < count; i++) { + g_free(isa_extensions[i]); + } + + g_free(isa_extensions); +} +#endif + #define DEFINE_CPU(type_name, initfn) \ { \ .name =3D type_name, \ diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 5f3955c38d..192d0c2d31 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -510,6 +510,7 @@ char *riscv_isa_string(RISCVCPU *cpu); #define cpu_mmu_index riscv_cpu_mmu_index =20 #ifndef CONFIG_USER_ONLY +void riscv_isa_write_fdt(RISCVCPU *cpu, void *fdt, char *nodename); void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, vaddr addr, unsigned size, MMUAccessType access_type, --=20 2.39.2