From nobody Fri Nov 14 23:30:24 2025 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=reject dis=none) header.from=sifive.com ARC-Seal: i=1; a=rsa-sha256; t=1759221357; cv=none; d=zohomail.com; s=zohoarc; b=kt9ubnSov32eXJOj2AGeRugKAFJkR7oVyOUbX5mNhadeOGyHX0PTxURe+fqXU3pwp6g7QxFOP5TTaWNEP60o7bVqJGOvpzAFFIqqJuGaPQSE3UCXmdL2mcEIyrJZGT2t1ZLYYjpofFti70h9duswbp9YjqSRn8plLrdMKvZjunU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1759221357; 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=bYWfU3Ybv8UMfXDoLYIZExvngPG0XH9qkihRnX+Zfvs=; b=aQBoZgHmpKahJfD5NcSLl+QYwAoeDxgUoIpFwTFnmF078kg+Pme8ccwdlTYiU0XCTOQs+N/nI3bxYaXb3GNtKW8SEbA/acSi+VuWtdg16nfoJ3gG1QU5DcIHKGvItkeqqQ3lH+BP/W/EqG1+AjEfhaCVyxWYOjqBt9pyIDuweuY= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1759221357306529.5993680181913; Tue, 30 Sep 2025 01:35:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v3Vor-0006HP-TA; Tue, 30 Sep 2025 04:34:45 -0400 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 1v3Vop-0006Gu-30 for qemu-devel@nongnu.org; Tue, 30 Sep 2025 04:34:43 -0400 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1v3Vod-0004P5-T6 for qemu-devel@nongnu.org; Tue, 30 Sep 2025 04:34:42 -0400 Received: by mail-pf1-x434.google.com with SMTP id d2e1a72fcca58-76e4fc419a9so5809488b3a.0 for ; Tue, 30 Sep 2025 01:34:22 -0700 (PDT) Received: from jchang-1875.internal.sifive.com ([136.226.240.190]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b580bd86c4csm10340089a12.14.2025.09.30.01.34.18 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 30 Sep 2025 01:34:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1759221261; x=1759826061; darn=nongnu.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=bYWfU3Ybv8UMfXDoLYIZExvngPG0XH9qkihRnX+Zfvs=; b=WB9v1EyMSrB+cW8b0dzIRTdgSG4fnLYyV94vhTE4ilYxHaPov7HE/DNghjFfyUn58o XXA9W3fSODfccnlvHQP2YWNhNlRzh4Hes5rIl2euqusajFBWKvVB6XSu2Xase0EhJ+GN d1DtB1MkSzAKAdfEeCaJQyFXIsOf/pkmTo1yENocqrc6ZdHwzXx42QtSjKfZJ4GeXkBk y3KMHwo5WKGPu/I16r/qKkdUqw/C3q65izIVhVEmr7xBrC7T0Xd2QDAGk+iTMbQqaq4n wAMI8LmMdu0gHXR++rDOAX0cd9W5HFbss8fDj95+VCsIyA6TQ3sg1Zt2wi4z+vi0s84P msLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759221261; x=1759826061; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bYWfU3Ybv8UMfXDoLYIZExvngPG0XH9qkihRnX+Zfvs=; b=toZIuWgIqBV1a6qZCzwyyMrBr9OOa7YKT5rsWGSqdsco9J9osE8001+hEqtPVJnw2M BsrGiw+7OGOWlv6EG6AzTAVNL5KihRQXcJhra4p1i1YLaddJXXp6jnFt8YFNPh0jwuKI GjRIrF/E73i4QSvzmS9BQbZBWavNre2//groAWG35Vi98hUODw6haNHxkpnW2bcqdFUi bz6fcc8Zu3+5Gt025kiXpYSbd5xVRwQXQwF6AXlZjeKD/eaAps1qRSBLmOX4bbw7O2D/ lDc98QrCEJOxOyDK5FG4aYLWRRz8KnRsh1+EhWDssfXXQLj7PcA5QUGADYXsbcXCo9iC H6SQ== X-Gm-Message-State: AOJu0YyCSlyPeiARJEjIp9Ajt+LLfLIbOQav2HWTgktNZfIDUiPnZdQy V/93zqv3wUkkHyYx6FYKsDG+v+895d8JQ+qOanMPtPq/ZwGrgM7TNZoZV6T5aqpIbiRLgewkAU/ 0XcFromBhg0krWg69iH7m0uIWabrQ49ySbCTEeF9wMWowjTCHQ55dOisQ2szqP8Kt/GZBAF6suI ElPSRI+HTMjNQ/BzMqxTrqzGUPkTSE0okdUdA2mJ3d X-Gm-Gg: ASbGncvs2U4DXSLT8iZBwx/rPKFmKRwekehnGSm0Uc0WNQcrB/QbiI/6Eculfg57WlW BQKmD17dUEkiaGgnihiKVuhzMPaJAxZeHq6bN6AG8kxBVvpsUDcNx/zfWFSWnqSD891sRSW2aMF e8DDnT1/YgRuaIHmhOjVWYCoNgMOJ/cGrI720J5NCzDhAI4uaVNMOsqgtPk/hpeL2YaSH5kfpVC yElmMb8xPVHHI2rgGqBxtoWEuTScgH0ynlLU2wEFbG77zw/2bcb9c20pcHD4z69/FdY+Ks576os zEFSFGS+hlxkDgJiHss0HeqzrjqkmxGdqYNUkiDWWxFTeGsJFDcejAOvcxKikTSY3DztGXAh8RS P3fObVJMjEPO9DBReQlvxSHM9SrMDS4EM1J6yvQOt5YEXMOZ6W8VGD25iTx2yfwHWTiZy4dZZfx e41NHJzbvv0826SCj/0nDc X-Google-Smtp-Source: AGHT+IE0Pm3cld6n7GtH/v3Pr0e5oFX1HPpvIvGf8N9Dk9vKysNenvlvrRJJ1mz/utB0iHYd9T1r3w== X-Received: by 2002:a05:6a20:7349:b0:2cb:5f15:ebf3 with SMTP id adf61e73a8af0-2e7d0daec75mr24610851637.44.1759221260555; Tue, 30 Sep 2025 01:34:20 -0700 (PDT) From: Jay Chang To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Jay Chang , Frank Chang , Jim Shu Subject: [PATCH 1/2] target/riscv: Make PMP granularity configurable Date: Tue, 30 Sep 2025 16:33:58 +0800 Message-ID: <20250930083359.27637-2-jay.chang@sifive.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250930083359.27637-1-jay.chang@sifive.com> References: <20250930083359.27637-1-jay.chang@sifive.com> MIME-Version: 1.0 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=2607:f8b0:4864:20::434; envelope-from=jay.chang@sifive.com; helo=mail-pf1-x434.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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 @sifive.com) X-ZM-MESSAGEID: 1759221358034116600 Content-Type: text/plain; charset="utf-8" Previously, the PMP granularity in qemu always used a minimum granularity of 4 bytes, this patch add pmp-granularity to allow platforms to configure the value. A new CPU parameter pmp-granularity has been introduced to the QEMU command line. For example: -cpu rv64, g=3Dtrue, c=3Dtrue, pmp=3Dtrue, pmp-granularity=3D1024 If no specific value is provided, the default value is 4 bytes. Signed-off-by: Jay Chang Reviewed-by: Frank Chang Reviewed-by: Jim Shu --- target/riscv/cpu.c | 39 +++++++++++++++++++++++++++++++ target/riscv/cpu.h | 1 + target/riscv/cpu_cfg_fields.h.inc | 1 + 3 files changed, 41 insertions(+) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index a877018ab0..73d4280d7c 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -1121,6 +1121,7 @@ static void riscv_cpu_init(Object *obj) cpu->cfg.cbop_blocksize =3D 64; cpu->cfg.cboz_blocksize =3D 64; cpu->cfg.pmp_regions =3D 16; + cpu->cfg.pmp_granularity =3D MIN_RISCV_PMP_GRANULARITY; cpu->env.vext_ver =3D VEXT_VERSION_1_00_0; cpu->cfg.max_satp_mode =3D -1; =20 @@ -1606,6 +1607,43 @@ static const PropertyInfo prop_num_pmp_regions =3D { .set =3D prop_num_pmp_regions_set, }; =20 +static void prop_pmp_granularity_set(Object *obj, Visitor *v, const char *= name, + void *opaque, Error **errp) +{ + RISCVCPU *cpu =3D RISCV_CPU(obj); + uint32_t value; + + visit_type_uint32(v, name, &value, errp); + + if ((value < MIN_RISCV_PMP_GRANULARITY) && (value & (value - 1))) { + error_setg(errp, "PMP granularity must be a power of 2 and at leas= t %d", + MIN_RISCV_PMP_GRANULARITY); + return; + } + + if (cpu->cfg.pmp_granularity !=3D value && riscv_cpu_is_vendor(obj)) { + cpu_set_prop_err(cpu, name, errp); + return; + } + + cpu_option_add_user_setting(name, value); + cpu->cfg.pmp_granularity =3D value; +} + +static void prop_pmp_granularity_get(Object *obj, Visitor *v, const char *= name, + void *opaque, Error **errp) +{ + uint32_t value =3D RISCV_CPU(obj)->cfg.pmp_granularity; + + visit_type_uint32(v, name, &value, errp); +} + +static const PropertyInfo prop_pmp_granularity =3D { + .description =3D "pmp-granularity", + .get =3D prop_pmp_granularity_get, + .set =3D prop_pmp_granularity_set, +}; + static int priv_spec_from_str(const char *priv_spec_str) { int priv_version =3D -1; @@ -2606,6 +2644,7 @@ static const Property riscv_cpu_properties[] =3D { {.name =3D "mmu", .info =3D &prop_mmu}, {.name =3D "pmp", .info =3D &prop_pmp}, {.name =3D "num-pmp-regions", .info =3D &prop_num_pmp_regions}, + {.name =3D "pmp-granularity", .info =3D &prop_pmp_granularity}, =20 {.name =3D "priv_spec", .info =3D &prop_priv_spec}, {.name =3D "vext_spec", .info =3D &prop_vext_spec}, diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 2c2266415e..04711f93a2 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -176,6 +176,7 @@ extern RISCVCPUImpliedExtsRule *riscv_multi_ext_implied= _rules[]; =20 #define MAX_RISCV_PMPS (64) #define OLD_MAX_RISCV_PMPS (16) +#define MIN_RISCV_PMP_GRANULARITY 4 =20 #if !defined(CONFIG_USER_ONLY) #include "pmp.h" diff --git a/target/riscv/cpu_cfg_fields.h.inc b/target/riscv/cpu_cfg_field= s.h.inc index e2d116f0df..a154ecdc79 100644 --- a/target/riscv/cpu_cfg_fields.h.inc +++ b/target/riscv/cpu_cfg_fields.h.inc @@ -166,6 +166,7 @@ TYPED_FIELD(uint16_t, cbom_blocksize, 0) TYPED_FIELD(uint16_t, cbop_blocksize, 0) TYPED_FIELD(uint16_t, cboz_blocksize, 0) TYPED_FIELD(uint8_t, pmp_regions, 0) +TYPED_FIELD(uint32_t, pmp_granularity, 0) =20 TYPED_FIELD(int8_t, max_satp_mode, -1) =20 --=20 2.48.1 From nobody Fri Nov 14 23:30:24 2025 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=reject dis=none) header.from=sifive.com ARC-Seal: i=1; a=rsa-sha256; t=1759221329; cv=none; d=zohomail.com; s=zohoarc; b=ccaqHJDZyFGY4jfgWAdxdsc6+obyy9nP+XXOQ1vB9Y2zJ2TC9bmccadgDO4qYYni1zjJphERiuZAbQMnma/taAGD9sLFzR2qQbg+s2hUgK6o9kusC7B5yx3ngnFOpRmgQmPB+zj0bC3asEcuzXMhVm5DcRQXMI+MkMH3oZiuzo4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1759221329; 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=zLBYrqjpNvkhmLUsF54KL5bWhDBVu9ThZEehNSlvIcQ=; b=mCWkz5/S23z5fASRRAtM5givqKokH8tRopbtX7AVc8ciWkkhGUZN9ER3nVOAReAAj8Kw+SyRdf4pQyZSAxcLQWTE97onfofbE/PxGbM2IeguGBVnchFOuFsDXW71LekYpliWw72LcU+ONh0F/0RzLF7yIUyybt2aOsdv8mkTXfg= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 175922132910699.92525167842939; Tue, 30 Sep 2025 01:35:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v3Vot-0006JZ-Ft; Tue, 30 Sep 2025 04:34:47 -0400 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 1v3Vos-0006HL-0n for qemu-devel@nongnu.org; Tue, 30 Sep 2025 04:34:46 -0400 Received: from mail-pj1-x102d.google.com ([2607:f8b0:4864:20::102d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1v3Voj-0004RY-BR for qemu-devel@nongnu.org; Tue, 30 Sep 2025 04:34:44 -0400 Received: by mail-pj1-x102d.google.com with SMTP id 98e67ed59e1d1-33255011eafso5651253a91.1 for ; Tue, 30 Sep 2025 01:34:27 -0700 (PDT) Received: from jchang-1875.internal.sifive.com ([136.226.240.190]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b580bd86c4csm10340089a12.14.2025.09.30.01.34.22 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 30 Sep 2025 01:34:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1759221265; x=1759826065; darn=nongnu.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=zLBYrqjpNvkhmLUsF54KL5bWhDBVu9ThZEehNSlvIcQ=; b=nhOpkzcEGd9drnsB3/ABbmvUT7KUCvZHE4+yPFvaLR5yIhH0L2QgndiAWT8N435XlI ietS7oKGpD7/4A+O8PoaRq2PKG1ef42Z43RMv5Jt+p5DOa16nGGsQaccPNoY8juo+G1z pjzftxWJfQDRb0WkTIhTy9z7PdK+oyHhZ1Q2XaigZzcxyTCvqQZ8NdGf9gOxW+foMFSx 76nAt+W7TvQODlwADUiFTPqNB2vhppr2W4Y+ragcKCV3KzlESV1TFxoZctUTH+kVFcl5 xXjqB0Ih9UoHSiKyb0bVmagDzXF9zgcOEv5THrw9HEpMJMAjJWe6E5OPIMopiA9IOnU4 jn/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759221265; x=1759826065; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zLBYrqjpNvkhmLUsF54KL5bWhDBVu9ThZEehNSlvIcQ=; b=mviHs3RFxXMcnhdKJiiJpja3KDs56FkTh8IFBooIG9V8P9IOqSMzp7t630rTs+JyG3 3qzX9aaFr1DE7S71LK1eTMKUT4R3uo9p2EhF93nSApvZkyoD2w7o/DVaWn4wmdfD5gv2 qnd1XvpJq4zrAWeFrEA21zGPILoliBMwzyZcZlzoxwbWAVCAPFqAr0PnmCJ6JGmNCoPQ FTA4pDEiLy2Vy60MDZEI/Qw/0aTd/cWYU19q4DlyEDQgXC0YHtav44SM0v6a6CKVQZsT /zvu6Y1Qd30tF67dVBb4GgypDBzaCvjcLjzB3CrnTIGpVck3mcSoEZFL3kV476nBEqhR Yz9g== X-Gm-Message-State: AOJu0YxG6qO89Z8zK2AS/Q0uOU8pku8G7H9IaiW9U44BbK9mkEWUI23P qzl1qcXmJbBedof/cH7aS940wl5M4jjm/TswTjXlbrjX5Mt3pnal19mz2Qt5j3y3kWkaCcE6D+G FBvBf1jeTTzfL6WP87eDydzNw/h0eEFLtFFORZVlS5WIjThgtTyr1o2wr0B8ZRgjeHvi+LUTuWt emj6w0yI3loUdIWvKq+wzocqdZndtPrGx8dpkdpvBv X-Gm-Gg: ASbGncvKK0718q2eRUJwoW7V6HpzvO+GOMZTgxIMAyjsP5Xf5u431Bn/8ioE1zSHruI QzZEL1w0cRikYMyEpSuj5J4kP3BpEcAGDT2f6wtt1vdnsLcRL9Ra37l672aAnC2AFcKj675yHRX /uPKBXJDBKgBy0d0nSE1ZY7t5k819iBusxdvNXs/m5AOmpo6N8EXs3MRO0nKH5wQ/xe3mjHx8yr uhNSov0a83SDvPPeicwurEkxVYt8C9SPf45WBxgEmNgQ7LjdDcd81LNz9dVzRogyTxoMDvP6P6o Z6CJ0zbbxA0wUmQwbuAh9HQE33PkTIvstZ6A4GHPIjjbwunnSTF7CrfVTLxMQcL3vOVv7LaWSOI DG6VlKxoBZ7MQU+SBvjXfoUgvLagTe0XCETgP/jkxPltJTYE7OXPdyiflVMZ3oO6u2djsvEpzHk T0tK/8kWrXEQ== X-Google-Smtp-Source: AGHT+IGEXTjk3S30/hwvfoxbI+ekPBIblXJ80EPwi785hk6LWn8afelfHnQgJo9pnxJQQ66Yfyq/Ng== X-Received: by 2002:a17:90b:1a81:b0:32e:8c14:5cd2 with SMTP id 98e67ed59e1d1-3342a2b0debmr19197010a91.28.1759221264641; Tue, 30 Sep 2025 01:34:24 -0700 (PDT) From: Jay Chang To: qemu-devel@nongnu.org, qemu-riscv@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Jay Chang , Frank Chang , Jim Shu Subject: [PATCH 2/2] target/riscv: Make PMP CSRs conform to WARL constraints Date: Tue, 30 Sep 2025 16:33:59 +0800 Message-ID: <20250930083359.27637-3-jay.chang@sifive.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250930083359.27637-1-jay.chang@sifive.com> References: <20250930083359.27637-1-jay.chang@sifive.com> MIME-Version: 1.0 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=2607:f8b0:4864:20::102d; envelope-from=jay.chang@sifive.com; helo=mail-pj1-x102d.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 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 @sifive.com) X-ZM-MESSAGEID: 1759221331577116600 Content-Type: text/plain; charset="utf-8" This patch ensure pmpcfg and pmpaddr comply with WARL constraints. When the PMP granularity is greater than 4 bytes, NA4 mode is not valid per the spec and will be silently ignored. According to the spec, changing pmpcfg.A only affects the "read" value of pmpaddr. When G > 2 and pmpcfg.A is NAPOT, bits pmpaddr[G-2:0] read as all ones. When G > 1 and pmpcfg.A is OFF or TOR, bits pmpaddr[G-1:0] read as all zeros. This allows software to read back the correct granularity value. In addition, when updating the PMP address rule in TOR mode, the start and end addresses of the PMP region should be aligned to the PMP granularity. (The current SPEC only state in TOR mode that bits pmpaddr[G-1:0] do not affect the TOR address-matching logic.) Signed-off-by: Jay Chang Reviewed-by: Frank Chang Reviewed-by: Jim Shu --- target/riscv/pmp.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c index 72f1372a49..d5cd76df3a 100644 --- a/target/riscv/pmp.c +++ b/target/riscv/pmp.c @@ -108,6 +108,17 @@ static int pmp_is_invalid_smepmp_cfg(CPURISCVState *en= v, uint8_t val) g_assert_not_reached(); } } +/* + * Calculate PMP granularity value 'g' + * + * The granularity value 'g' is defined as log2(granularity) - 2, where + * granularity is the minimum alignment requirement for PMP regions in byt= es. + */ +static inline int pmp_get_granularity_g(CPURISCVState *env) +{ + return __builtin_ctz(riscv_cpu_cfg(env)->pmp_granularity >> 2); +} + =20 /* * Count the number of active rules. @@ -153,6 +164,15 @@ static bool pmp_write_cfg(CPURISCVState *env, uint32_t= pmp_index, uint8_t val) qemu_log_mask(LOG_GUEST_ERROR, "ignoring pmpcfg write - invalid\n"); } else { + uint8_t a_field =3D pmp_get_a_field(val); + /* + * When granularity g >=3D 1 (i.e., granularity > 4 bytes), + * the NA4 (Naturally Aligned 4-byte) mode is not selectable + */ + if ((riscv_cpu_cfg(env)->pmp_granularity > + MIN_RISCV_PMP_GRANULARITY) && (a_field =3D=3D PMP_AMATCH_N= A4)) { + return false; + } env->pmp_state.pmp[pmp_index].cfg_reg =3D val; pmp_update_rule_addr(env, pmp_index); return true; @@ -199,6 +219,7 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t = pmp_index) target_ulong prev_addr =3D 0u; hwaddr sa =3D 0u; hwaddr ea =3D 0u; + int g =3D pmp_get_granularity_g(env); =20 if (pmp_index >=3D 1u) { prev_addr =3D env->pmp_state.pmp[pmp_index - 1].addr_reg; @@ -211,6 +232,11 @@ void pmp_update_rule_addr(CPURISCVState *env, uint32_t= pmp_index) break; =20 case PMP_AMATCH_TOR: + /* Bits pmpaddr[G-1:0] do not affect the TOR address-matching logi= c. */ + if (g >=3D 1) { + prev_addr &=3D ~((1UL << g) - 1UL); + this_addr &=3D ~((1UL << g) - 1UL); + } if (prev_addr >=3D this_addr) { sa =3D ea =3D 0u; break; @@ -577,6 +603,7 @@ void pmpaddr_csr_write(CPURISCVState *env, uint32_t add= r_index, =20 /* * Handle a read from a pmpaddr CSR + * Change A field of pmpcfg affects the read value of pmpaddr */ target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index) { @@ -585,6 +612,25 @@ target_ulong pmpaddr_csr_read(CPURISCVState *env, uint= 32_t addr_index) =20 if (addr_index < pmp_regions) { val =3D env->pmp_state.pmp[addr_index].addr_reg; + int g =3D pmp_get_granularity_g(env); + switch (pmp_get_a_field(env->pmp_state.pmp[addr_index].cfg_reg)) { + case PMP_AMATCH_OFF: + /* fallthrough */ + case PMP_AMATCH_TOR: + /* Bit [g-1:0] read all zero */ + if (g >=3D 1) { + val &=3D ~((1 << g) - 1); + } + break; + case PMP_AMATCH_NAPOT: + /* Bit [g-2:0] read all one */ + if (g >=3D 2) { + val |=3D ((1 << (g - 1)) - 1); + } + break; + default: + break; + } trace_pmpaddr_csr_read(env->mhartid, addr_index, val); } else { qemu_log_mask(LOG_GUEST_ERROR, --=20 2.48.1