From nobody Fri Nov 14 18:21:18 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=1761100974; cv=none; d=zohomail.com; s=zohoarc; b=mLy9IB5+Zk8z2g6wAr0bt1tegVw4riMDuOhpPkCLkaIfMkdmKlZQRGx6rHBl7QV0GyFlqGISAxZzx5KswgLiHR1q6fOKwNnP6CC9NUGO3NHc3ShJ+hrO3chpljfKA8a+gC0H30rrTjPAKMsMHm4glZ4/UmYQkMkM12Njo/XIGS8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761100974; 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=CHqgyf5ikq9QP/0GvwqqTjBx/fXXjprw3nqWpHt+OVfrbYMVUMEuRqHxWdWTGSb2VmYpv1r/z/YTi9gpgbnK7nGGm5gig2TicYb3dq5vXWAmtnNW7BC4gXlpCrbQuui4OJTeRQcrgtlmQdqbxC5refUdwQWeJ9Wq7ruY0QBfhPk= 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 1761100974286158.31229333890792; Tue, 21 Oct 2025 19:42:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBOnV-0003Q2-3L; Tue, 21 Oct 2025 22:41:57 -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 1vBOnS-0003PC-VT for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:41:54 -0400 Received: from mail-pl1-x629.google.com ([2607:f8b0:4864:20::629]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vBOnQ-0002JL-Mp for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:41:54 -0400 Received: by mail-pl1-x629.google.com with SMTP id d9443c01a7336-290d4d421f6so49097015ad.2 for ; Tue, 21 Oct 2025 19:41:52 -0700 (PDT) Received: from jchang-1875.internal.sifive.com ([136.226.240.196]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7a22ff1591dsm13204731b3a.7.2025.10.21.19.41.48 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 21 Oct 2025 19:41:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1761100911; x=1761705711; 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=GhRFt3/ytNFuDG/zI9MECKYTKCl5YiSwCeLCwQ4v5Lh0oOLZ7sbD1rSKNxFaCMqb8O nM5oT2puD6tLVXOeDw3Lm362S/abg6uIlmbcMGYmu6OY227Y9pVZeftBQ+xgaUnqgwcF dI4siNcU7IKttVCKcr/ArGD15ftULk4GVXGOZ241ZS8AyG+LbKdtiru2m8lcO58Trbx9 ezKzIIqLV1ZOO6ali1tspIzHAfGf4YOMOclfUb9JPoMU5+PyNC+8jR6kWMv4vmLeEWPM gwzNO/o++is4Vqxrb0NZBtYDMz0G02lCe7ZQBamJXjGiX9IGek1oV6St/L2veEqBMwJz 1Prg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761100911; x=1761705711; 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=hubyMimaHHszu8kgaW8CmISirof+fPweN1wc14YEeMgWK68gWnUjQ6qNFg6ZLvLwZv QTExXe7BZsVf81tP7djkRU0BpXiZkX5AIcl3RZuC2L0ZJWekLaYCDUiAk0nEw346rQso FK3h0XQErGnkRH81xqmG0KR82uTs/ebAg7TvvQn/amngB7SCZymkGjM++hkLvosXK8eW Vl+3LDcR4Qb2N4u+o10RXDFak4CujTTCvz+mK7z5W8YitMvCKnAj98Gw1I0/6APhQ/Ll jIc+5vz8WZhoDX/8JusjXwIJ/C4NU/emvpWM7VtDiGzp9Wd7USR6+FajoU5Wj58bdCbQ NAnQ== X-Gm-Message-State: AOJu0Yzl1Pbevu/7fda+7eHmA2vfzA7t+olYkCL5OyAJU8K97l9yjj8/ vaJiIs0573Du1oksN4Qgttd4ei+AsVgnTm+AEb5nlJeXwKqq3pYsDII9+Dh3ZCE1P6SvzCn7StM yBhAtgIRd2CirRGJxjwwFceKGcYJ02b3ciztRv9r0i4WXD6X809A70Mz5cre8jd4J5LBtkrTDsk /yk743vLfmnMNR9Gh6RM2DOQEbO95TG/ZYUavvCy/W X-Gm-Gg: ASbGnctk8mNkCcpPu/bIezypESMyugqYAV9+M9wfBiJeOUiy5gRdosZ42bwWZszrTWl 3kgUsv+lawfn//GH6m3KFMHeZbYANpfvvBg9+mVbWB0AyRCmnSPpxz4/7Oy6OHAw9ni9B5ltkqH FhtjbTJ7u8WCoEuJLQcOIZzwcCg0mk6eDQX0z801r8qg26XnRsWjJ4rRKKwi1hT1CXFlsdSNYfk 7wFi+5S0sVqOEaOzSb++ORKjJ8POepQMsQqHtFyBvldEaOMAori0G0t30Ak4wPizeutJo0uGE8M PNk4gif0bs8mMnSPnCEes/i9gs7sbXg8a4FvKVTIKnciUNCdt054C0vu/HGkppg0rE9ePD38jri NpXtyKcKBmD+AEaNb5uKwvuwhdYk2qIGsi6sUH9XTNkpojx9CJ54q1O55TEjs6cghaVtGXZEIfe kngRmI+c3S/+aW0XJW+T420K9JfCu8nPcAe36T5rI= X-Google-Smtp-Source: AGHT+IFb6J9Io8exj8o+qJbFf40aUI1cA8t55wtn/Hd08ZlcuC9kSYk+0HWZPNgXyYDpBWR7f1mWXw== X-Received: by 2002:a17:902:e5c2:b0:26d:72f8:8d0a with SMTP id d9443c01a7336-290c9c8c7c2mr246464205ad.12.1761100910803; Tue, 21 Oct 2025 19:41:50 -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 v3 1/2] target/riscv: Make PMP granularity configurable Date: Wed, 22 Oct 2025 10:41:40 +0800 Message-ID: <20251022024141.42178-2-jay.chang@sifive.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251022024141.42178-1-jay.chang@sifive.com> References: <20251022024141.42178-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::629; envelope-from=jay.chang@sifive.com; helo=mail-pl1-x629.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: 1761100979242158500 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 Reviewed-by: Alistair Francis --- 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 18:21:18 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=1761100999; cv=none; d=zohomail.com; s=zohoarc; b=anOwYPPGrQjnHCHGmr3ZawT5QEb467njbBQ18BvribFecrfUbfFSusVilUlAFfXF3A7Oz6hNaJ6iXmD2SeUb/Vw4t2zmbDLGOBcdqL5coqbs/0HKK/KahfTFBDhXHH+WISpilxZpt+4vfKixE5Mfani3r+CiHqitPIOiIyoZZ/w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761100999; 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=Q4f9YnaYgyvKsd8XILEdR5MrfELcvzlciUpM11jpKgI=; b=gSk+4LmQQ0Ulm9WNcLUiyCkB31G788p9ngTuh0SDGMxO89pMU7HxNT94/itFtunI9TlAW7CSQex1G+46iSdCWkmpNWfbbvw9vv6Bhha7RvqcESrUYJ1KasnecSqbYWjhZlCaAPImwUpQWW3k+Eu/dlsEu0GyH/Mu+uKl5/eMyp8= 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 1761100999084776.8259411464561; Tue, 21 Oct 2025 19:43:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBOna-0003RI-5L; Tue, 21 Oct 2025 22:42:02 -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 1vBOnX-0003Qh-Jc for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:41:59 -0400 Received: from mail-pf1-x436.google.com ([2607:f8b0:4864:20::436]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vBOnV-0002K4-P8 for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:41:59 -0400 Received: by mail-pf1-x436.google.com with SMTP id d2e1a72fcca58-781001e3846so5812943b3a.2 for ; Tue, 21 Oct 2025 19:41:57 -0700 (PDT) Received: from jchang-1875.internal.sifive.com ([136.226.240.196]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7a22ff1591dsm13204731b3a.7.2025.10.21.19.41.53 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 21 Oct 2025 19:41:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1761100916; x=1761705716; 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=Q4f9YnaYgyvKsd8XILEdR5MrfELcvzlciUpM11jpKgI=; b=hWsTDQc5khL6zrH1DXVIx1dHHJFwMdt/VUj/7PdE/lWWJQ4uSBPXR3wf4Zf8V+upJ7 86aIT05B58Q/7WA3dTC9g93hYxuUUJ3wao2GlSkAJmu+yqjcWU3PiUkg+68eGkpt/Rf/ kESCSGrbBNKDxmh5ZNinKdxnWXoueeUgvpH66a395+HPKSEUb+b7/iHw0v2kLSI9PQ55 sacZi+pduoVzCPrz9xJqvL8BX/Z70mKrDwNRKb1k5cDWG/41EV5I7D94/Ep3ANXBijxC Kz/EDU8CcefRucfLnHbX82YC4dfdVU9mX4PHIPI6pKfXJD22JV28ansj7oFAOPPWzhuf Ly4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761100916; x=1761705716; 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=Q4f9YnaYgyvKsd8XILEdR5MrfELcvzlciUpM11jpKgI=; b=sao+PgKUKJIwI2TTT0xyoT0Qyu1n7UWWWcJ5K36h9+rZVCp/JXqPab4uCWxo94MoRd F/bjaRvfMvBFWbCDcgk1IuE5jOBE74Gbk2qks+d0oJCjPOtWWKec7pV4ga6pnLGBWSC0 Qmp4Ch2UZnTq6qDkedObO4m81sd7bA0IB26W5xBwRaISWRpvBL0kqzSfyOhCt3BrB/lJ QnDqALheQw1uWe9+pl10RE7YVUHJ9hVBeiODVcxETYNv5PHJUA8ezZXAHAcei+9ZZ8ZT 1STiJVnYp06HrGMuRMphme7k3PSo84jJwfpxwYvRJQ0kzdBXPFmZ5EOlEtKu0zHA/Q9X FOlg== X-Gm-Message-State: AOJu0YwY7nsJflNWbND4GUVT8RHC4aXRWosdRLySaXa1aCrxgAeg/IHl kMfWXVTlCEA9100efTav6NwLJ3tkbF80HFgqJGu4QyjuIhtweLcZNo2BS8B5kXyBVMLaKPWiAGB Rz2EWPAQci/Tk/4UwSscOyMdhts5VQ21/Sebnz1Io/FsCg/t0iuoFbjB3N4EQ4CRov+EPVFBfVs zmga8dDfRsKXV29qy4ALYM9Av9lSrTa6z28SoN/LYu X-Gm-Gg: ASbGnct7N1bpxBiSgUjAkdxt8WFXFhRuLHZ2cvScdRWFCF4yKHiH7zH2RU+ISZ7P2ak DgpasGqamrwXzlw+a5lK46l3GtdC8XKtZqWII+WQyTgz42CvWVBuFJlIpp0V81YCQcrLxLOPXo+ aqJRd4B3nMqXyzozkualkBrZK4q5JiCTBN3QFXOLQiArxjyTRdp5eC557v+Pm4HpU/25VggMo6u Ke2wWQt3Ti2myARsKs67DEtR93m7O1l6Ar9JBodSjPGnvNv4rI7rHlFGqKSoWhoiT3qM+LYz2NW tZN7BLAo6/6/Z4waEXxZhaTVH6hm5XJCKRAxEWoSNIomf9uXWd3pleNAwkGFgnCbwgCgP07VJKf tvNLf/Pj2HS6sebw6E77bIQn3BMNUuBJ+xEgHh/s1nSZMKfCLcfKSbaXV1bcPVlm+M+3bk+S/uo bLrwXddYqOyveXkgnZL9uWKFODnU1K/XH1GX4O7pTowCKMLgmdpQ== X-Google-Smtp-Source: AGHT+IH6u+daJq6CxLSlNxXGuZMH4W81DsaK3v1Hd0ZnxFgtoqwftc7Mxaph4dVu4Df70D/tGdLDNQ== X-Received: by 2002:a05:6a20:a122:b0:2b7:949d:63da with SMTP id adf61e73a8af0-334a8564eccmr24644909637.18.1761100915802; Tue, 21 Oct 2025 19:41:55 -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 v3 2/2] target/riscv: Make PMP CSRs conform to WARL constraints Date: Wed, 22 Oct 2025 10:41:41 +0800 Message-ID: <20251022024141.42178-3-jay.chang@sifive.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251022024141.42178-1-jay.chang@sifive.com> References: <20251022024141.42178-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::436; envelope-from=jay.chang@sifive.com; helo=mail-pf1-x436.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=unavailable 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: 1761101001566154100 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 Reviewed-by: Alistair Francis --- target/riscv/pmp.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c index 72f1372a49..3ef62d26ad 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 ~((1ULL << g) - 1ULL); + this_addr &=3D ~((1ULL << g) - 1ULL); + } 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 && g < TARGET_LONG_BITS) { + val &=3D ~((1ULL << g) - 1ULL); + } + break; + case PMP_AMATCH_NAPOT: + /* Bit [g-2:0] read all one */ + if (g >=3D 2 && g < TARGET_LONG_BITS) { + val |=3D ((1ULL << (g - 1)) - 1ULL); + } + break; + default: + break; + } trace_pmpaddr_csr_read(env->mhartid, addr_index, val); } else { qemu_log_mask(LOG_GUEST_ERROR, --=20 2.48.1