From nobody Fri Nov 14 18:21:21 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=1761100099; cv=none; d=zohomail.com; s=zohoarc; b=lZyg019Ff5z2ZaoRggtXfnZUlB5BeZ0TDYZDp69Giwo2MBjM9CADEkdJjcN5YDo6myMMfpCzAYXuIzlKeNcG06mQuyvOluIYkWkUFhpz/UOEoqioogHhbcCaCuY4HSk0dEkfEDXhoX/S2NEdtEkyF8YkMlTVbw7FRQERtnmxVuA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761100099; 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=kfteD9cedLJiUpMtqeAB1Y7abuGxmtju4yc/Nd3Od5qqS9DCtvfMQO6DPHZk3+gmX0bxGhYxDhWCctqC+BoEHhVm4JAwwYhVoeAQaMJeQuV5Mx3KpT+kw8GLut5ExaSIe/D1nIUocIntjQ9Ga7ZstxP3oJIdQKGvsuXkEXHPXVE= 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 1761100099784320.5604851372981; Tue, 21 Oct 2025 19:28:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBOYy-00074r-TO; Tue, 21 Oct 2025 22:26:56 -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 1vBOYw-000744-0i for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:26:54 -0400 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vBOYt-0000yJ-T4 for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:26:53 -0400 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-290dc630a07so33910145ad.1 for ; Tue, 21 Oct 2025 19:26:51 -0700 (PDT) Received: from jchang-1875.internal.sifive.com ([136.226.240.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2930340092dsm4673545ad.42.2025.10.21.19.26.47 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 21 Oct 2025 19:26:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1761100010; x=1761704810; 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=Euv9mtmGxlcBRMG9daFM+OYJNpS6b4oPiNvAPZa1w1tjTLKmGKfy22Ols2uJA+xb4O sruonwPw6n2YkL+8WKj6wkErSEKjQ6FnnpqAuBsqPMsAFvCPW0VSq5jvEdDltqnaqH+i EjljFQ/o0SFv33SaraIGfcT28LZ/GEGSYs/XuebFGBe5wZVYnqpnOgwBmsaMKdGL0uMs 1YfTf/xoGE5NUGDRLRQ4YhDViB/P9L0vu21NegbL1lgK6zQvYkLngegM2NPtrJJf6qcb NOpJM3ed5uwl0NyXDvWBmvVMOmMZz9lZeZbyPe0DsF8T6i0RQe4cZxOx0SvQ69aO+bGT m4uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761100010; x=1761704810; 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=IOkZBzDlyWPzo7UCNyLRHfg0waE00spIEIjwr39F1IEJ/FcqfNBbhtUAI7O9PVm3FQ aqvSVGAD720ff300zRrmhBCCdQXnQL+/rm8bLG5dRumWAvzmXuSYu8TUz5IOpOk5U9TH BMwAJ5j9YeQm86F2pU1QcUZ13QhAL7Y/FpffJmftbcS6FVSSEGp2OJwbDg01mz26n4/5 djXl1uczYE2WoZ1HVvzOLMyBNbFKKD0KQ6b4WQ/1bd46x6/jpn02e2yFpnpYiQD9eVfJ kwpxAsv6evcMCsSx8eUL2Po/nJEpwExCAOC8NOvVtBLVbSIbJKxiDPH6/znmnp9SKrnu xprA== X-Gm-Message-State: AOJu0YxrL/mAy00Ct5gVp7jhSjI/vzh01SZXEm5r2xTuB7VP3cks8Zl5 VlHH4B7RD5EAj0+gSZycjLQypTU39T/OdF/0GwnBODoD7rUAHTqQdWgGAHVsmi/hW0sMosESTM3 xzomFZi1WLhYDokWpwMcaxd0OsffT9MhPLAURtKCITnDZ3RR2RQuHZn9GVUDGjXod98HWRA4XLF vVNT5hwJ8khuMs99ca2Hh8CQsLkAzT4LV0Mp+OBIqZ X-Gm-Gg: ASbGnctyNz4FGSPQPBCsxxRgQQG/BzaTP4ICEmDGlXXCxwI2YaYehd+l19ldZTKoUiO dqFS79ZBz6t0iKDmNo+qsAEiaeczwefR6dxt6iDm1et63Wmz1De6/wAVvkL0dHY/IUw7ydc4Vo9 gEgb04KKXbHck9VTfV1rBX2XxXJ9GNh4YgrPsBk7GhorDRowumyiuEuKorHRxX3l0xZ6mZqwk1L zVMR6zDqRo8vrpcKD+T6y202t9jZgrAKdUG3AR7+8uZsAlJV0do7g+Dn7nnulSHVnScEU8fOo8P WDO/aYpvx/cvsP9q81iRAMX+trscScgWib9zEnl3iZdcl4lmsj7mW4xdWkuDS9+YFvcbgWbTGpB XGkChkddhlkAkzBdrZ+bgmGVk/52XfIm+ujtt4WDe9n9y51hYAtvHbFUDepsk4nqI1Crgw6/WxI 0P+U1eqia97rmPAiaWONTowa+om6TZklhKsz2oDmasIrgmA/Jm6w== X-Google-Smtp-Source: AGHT+IELOz5bK+BMNWzDq3/hRBaG9HYO6yks1D1dkK1YPSz/O4c0BqOLJQDPdkTwCrinrnDw5CmUXQ== X-Received: by 2002:a17:902:c951:b0:25c:b1d6:c41a with SMTP id d9443c01a7336-290c9cf3517mr253158195ad.11.1761100009456; Tue, 21 Oct 2025 19:26:49 -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 v2 1/2] target/riscv: Make PMP granularity configurable Date: Wed, 22 Oct 2025 10:26:27 +0800 Message-ID: <20251022022628.41307-5-jay.chang@sifive.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251022022628.41307-1-jay.chang@sifive.com> References: <20251022022628.41307-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::630; envelope-from=jay.chang@sifive.com; helo=mail-pl1-x630.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: 1761100103152154100 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 18:21:21 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=1761100098; cv=none; d=zohomail.com; s=zohoarc; b=SHAOWSMmeikJhjeX5j1bBA5sCvn4bRxEagpyjaK36Tpschovj/O7KModcytNpkrzeBQEoDzeAYIAT5dtFO2QcN9H/j1wc1CsAWakRzoOXDDkjsXGce94A5kfpG1+dX+h/0f62xGtT43ph6ZcIQZ15+4UkK7cW8aeIT4VRCh2ZS8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761100098; 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=BjJP96rw/7zGUF4PjxJngtN9rw2gPkG3XtBMIOptFo8Zrk3lZUNN5TKSFm2oM0v3rW6o9McuKZXisL+/oT4ue3d4GPhg1MjS88cpjkNxrVmWRGcv4mCE3GKkh5YOlQb+5r1hUr+8xUliyWdTB6xstfdRYMx1nEzidSiHneJtAmo= 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 1761100098508939.8205834400391; Tue, 21 Oct 2025 19:28:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBOYn-00072C-80; Tue, 21 Oct 2025 22:26: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 1vBOYl-00071X-Fo for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:26:43 -0400 Received: from mail-pl1-x62b.google.com ([2607:f8b0:4864:20::62b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vBOYj-0000wi-JH for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:26:43 -0400 Received: by mail-pl1-x62b.google.com with SMTP id d9443c01a7336-269af38418aso78436455ad.1 for ; Tue, 21 Oct 2025 19:26:41 -0700 (PDT) Received: from jchang-1875.internal.sifive.com ([136.226.240.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2930340092dsm4673545ad.42.2025.10.21.19.26.37 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 21 Oct 2025 19:26:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1761099999; x=1761704799; 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=mFQ42KHDaMe0xQom01hozNjHKp9QvEYY/EKRJCr2QdhMVUu4AXL1o2gVhc96Xz9SbC tKoaLfsGyW0oMgWLnQ6eknhQnzCgCyqWptd7bnkROkBIg43U5/ECNn8eg7FfHHiRIAFT JDOLJExaOhbf5wQOA5tf8Q0wGMLjDEFukZpap/LSnEi4a80MP/wZSddWH5Ck8bsDDeDY +Ht8Pm4K3Doiuy5KIkxdx50ZvHwdz0aI9kDv31dLzoK9ih9bSkIKHPA5YhZOEqNUDoZb ky9FvOvm1VWbx/He2ifZIkQt8D25u0rpTJdrzBy/fuD/KtFWn/jNezQwbX/oY7uXXo5y wdmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761099999; x=1761704799; 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=LAYT7Om5i/BqxH3tlvgIIBinHcan9ZwwBOb5htlBuxpUGlDWnPUkmQLkGo74YGXWW8 T3QnBB937icDqrZLAEd1XFe6bg3Xw/Eb0DHL/A/+jsvI8cyGHf13VfQtilRaatS89rg0 MR0Jd9tQ7xO0VVIUkWN54wzPPMgv9jbRiXhLmBmtTdTjwdiIBrtdocOVCmOPmzsu30AZ cYQUEoVstJaGJ3tIpmhC7T+8bqL9aYsk64kgVlTNguyULM3B6WoPOHaQrddp77LEGvMK N0nXeWOUeAZV/lhxnebk2LOi/7sHhCkPmDtTMyZSFEujm+3eUgcz3dPmkgqWyagcFElz WHng== X-Gm-Message-State: AOJu0YytgBqGM1nje3K7fUimbycx1Q6kKdLeJZIXku5EcVpGvajO+LYG fGRJYlukqTkfUXPTksRiXJh94e96pkFU094m6t/ZT/nbUFHxc8dR2CNa9HGxA0v7L5i9kLZ/RCB kER66JCLwjPDVJx0D+RaSzyc0WsaAndQQToi0aphYbE5IwqQg9d7tWxxpnuupk11oO6mJai5eO4 K5DuZ/KjRpiyH/jtrdygcE4u9k6wuzdIVx772d1mVK X-Gm-Gg: ASbGnctQcB0YrWnsiHmdSCoW3JjXlIiwZvjDBENgCrS2llg2z/seU+1pWtOxi5p+44U Fz1bNl6iq2KTrE2POydJKEPZjRkkW4gHlC3GKs5xUaO1xkvr2nV4HB9UEat6vSyA2GNB0nuDP2G JKogBcU758HGlB4vlFUvXLtNPxRnkhPxLJIgRrZ/bSpzF/M22ww1kxUhEQi6GJPhpYeki+XB4RM 8CXpvf0FFs6dbaJfgSo3N3hQ6CPVQoPIgGJ1heFADvnU6XG12f3MYYYIe6K27syfxP+TXkewnfM AT4NNw6pE5V7lQ86sYqJb4kDuPSwjY6dMEXhH+OtV1DriHjnlvv3nQbKAN+eVkGT0Tc3JwtQHxK LJ0F/PE//pUb+t3ON2Um2jgE/WAsRCYs6vz6HhXcjaSyoWZxkflQTUfZ7A+0Tnf4OaNxfJaY7jT bv7URnKhmIRejuRuNXo3k/tggsXnvNWEldLyFaiB5orMtz6PUEdWVlm4ymNxTH X-Google-Smtp-Source: AGHT+IHrnWkZFh02KcWnwFZ6SA0AevY3gArLXrkmpSsvhFAFWPgLULqpv20TSwEPyQQxl+Ph3vdVyQ== X-Received: by 2002:a17:902:ce12:b0:26b:da03:60db with SMTP id d9443c01a7336-290c9ca6b1cmr238723685ad.13.1761099999416; Tue, 21 Oct 2025 19:26:39 -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 v1 1/2] target/riscv: Make PMP granularity configurable Date: Wed, 22 Oct 2025 10:26:24 +0800 Message-ID: <20251022022628.41307-2-jay.chang@sifive.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251022022628.41307-1-jay.chang@sifive.com> References: <20251022022628.41307-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::62b; envelope-from=jay.chang@sifive.com; helo=mail-pl1-x62b.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: 1761100101577154100 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 18:21:21 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=1761100124; cv=none; d=zohomail.com; s=zohoarc; b=j2jDKZtfHtO6WKC+8l79sp7He2FArklZ/etgVUzSl0x/d5BUMEJGcdrJmIVsywBcY4HPnlN69OZq5ETNpPr+J2xc5odc04zIVjA4S0ajo04cB5h84viDT1I8d/Ak1GlBBKSA9oqEjciMkvEwZoNtmajsg2womlsRz9HEc9KzPrU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761100124; 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=SwzaFlrABTmTaXs0/eThs1Jd/sQsHm30n61OGKtFkw3/n5HdeWDWGl2Z2+000KB+2Qpzl2xSOBlJIPvCz7yxvWBIIcxU7PV6l1OPdRaJgYRPLv2tmikolwVpal5VPhwr7NJZr20iCDjxdwxOyY0pM1Lf2YSekrLiDdzUevmARc4= 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 1761100124717204.885996851291; Tue, 21 Oct 2025 19:28:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBOZ1-00075V-0C; Tue, 21 Oct 2025 22:26:59 -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 1vBOYz-00074v-0Q for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:26:57 -0400 Received: from mail-pl1-x62a.google.com ([2607:f8b0:4864:20::62a]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vBOYx-0000ym-4K for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:26:56 -0400 Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-290a3a4c7ecso67722705ad.0 for ; Tue, 21 Oct 2025 19:26:53 -0700 (PDT) Received: from jchang-1875.internal.sifive.com ([136.226.240.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2930340092dsm4673545ad.42.2025.10.21.19.26.50 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 21 Oct 2025 19:26:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1761100012; x=1761704812; 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=JOJvXndhb2tRuGcc4mHApbxONhM4vTBaHFl6oCxfeu3pOwdNj5pykp7QOOqjZDiPyZ LhBQeRi4CDYqDy1vUes8+bP+5S0bbAw/kY61ywuU/5MFaAhyc7MKgiCz0RqkA8XKioql /mdWLCqnKC66FkDdrwSri2mPEi6KfsoQ1e+jWovXYNy/0QiSigMc5r0yAeVhL1lipvm4 7D1L46WAdeFxHfhA5rHssUOgI89HN/tU9hb1S8CZFq6rotkPlL74dztUr8BWO0D5QkXV Vb3wsMuvHb/DLiJSaX10gagg9IjFN4MjnEGB2rXYUtlpNhsNP/qwaX+4s2ZZkVs3iT0F 48QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761100012; x=1761704812; 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=kVTq/k+s6QNjaR3kbJvA8XgKTTTZcYUe2wADZVjZ9K+A/UHDFJrUkGn7zRDK68O9m8 3+Vm4O4NxQtskb/NOz9xKoPapKBy3r87K7s6LVqRLmcnkSFrxs+NIDGbpIimjL52pkTB pWiNlWMrQ+QEbetKzDKHD91kHg79vbnDL4G/fJuHLsIshW8UY/h9q04D5LUhNE6rwm+u Fi2M6vcClOrCvDjQJ4yJgnooIJ+WrNDkfLmw6eh+rTPFoLuZfd+zY3nYp8JqjXgx5zJA Nfd1iTf7gwqRJy/CGd/sS4lntvcCGIRPfPsntQS1WQj4f/hmREaoNiJ6OG8WbcRZYoo/ fUCg== X-Gm-Message-State: AOJu0YzDHdjw7j1bBLknxQN1isbbp2uVk5ee/Ef+ngO4i78ziOmK/jfF 7TIgQJrBuzpxn/LFUAXHoeVICB1Zbc9EiOCvgCz8UZFQgJSCcYJ5tFbNvqYgFEmBnLfNSDZ7Jr/ K4gKg7UqPzTQifR7vGBrm922yF124aql1tkwTbk4gFCsFVZAK/4ubVo2suKfer91fxddY9pnyca aCkN5CJPCV4A0Ensj6UJGP8aEiZ6vpYJg97Q2VFgeI X-Gm-Gg: ASbGncuLJqh4ldM2K2qxex1feZVxXNPQuqb/HdJdwVSuatbP23beBOPWmfBNr1eNbBJ FBwMrjG/OEJgIasnvfoo1zEdu6maQDGwli/M4d8T4SueRBwiWBRIaz0iE8E//dKUoU53QSi52cR Eok7wYtx7NnFeFiw2hDImkgogCp+TMv8PfH5dSxJ4KpEivuZnToyTkK8cccOnsVQK9zb9No+xAl ddFquf7x1FqBvDX3SVHqJHYQsOexlBnK+d46X6cHbxKAJmO7lOHseHqNHiHaYiIDhMK/DWS4hwo 2AzQ9hQ9YjPI9GAthd0t3lbxPdI+6wVUK5u2rNgqE2tUsrBCLLLKBSDeRZcyiTwRzGQoqkKCzW9 iFBpmlUa5+IQkafIUaGIhIiCITeUVy/Q/LVtVWCoxBdbrq8pRvxiCMtliNf+ez0JkuyNa5yCSu3 7iygwdTYARsF3kbCuXwZROO8mdibLdud2/I1m5q/9bDHg1CYvQ3A== X-Google-Smtp-Source: AGHT+IEcffunv84UNmFLL+IM0NukBY0a+TpBTZXapGk9CCF7hVDQO0E5K5BcPjq/Kv9BzH7qQV54UA== X-Received: by 2002:a17:903:1a0e:b0:269:603f:420a with SMTP id d9443c01a7336-290c9c8932bmr223852665ad.5.1761100012425; Tue, 21 Oct 2025 19:26:52 -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 v2 2/2] target/riscv: Make PMP CSRs conform to WARL constraints Date: Wed, 22 Oct 2025 10:26:28 +0800 Message-ID: <20251022022628.41307-6-jay.chang@sifive.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251022022628.41307-1-jay.chang@sifive.com> References: <20251022022628.41307-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::62a; envelope-from=jay.chang@sifive.com; helo=mail-pl1-x62a.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: 1761100127486154100 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..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 From nobody Fri Nov 14 18:21:21 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=1761100099; cv=none; d=zohomail.com; s=zohoarc; b=I+Mg9i1By3JpqyDpkEwkBUF9HsPIerf4ISSfr4n/x5LrI4hy0ZSGsIe7gDWst0onDv/ZEc+IQ/iBvmLFoRWQJfAVI3Pea+y9yspvq7KmaOs5erkZmVZ7yrcLFctR5Fz6BDW8irp1okaOdiGliCHjSkXjCk2K99EAXfJy2xRNksM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761100099; 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=026+MkGDqz12mXQJte4DznqG5pLwCGi6DGsBZLqInuM=; b=SM8NZlXR1kZm/x0JcJLbYUbeOjRy+aAZHukCCbtVgAuJ4RKAQZOzhPKdhvf/RCBI1cPbwHVKsTEq8B5CsE+UCqNglj7fyH50aMmiVdWDwRK5bXONKCiGd0MTfgOZgxp+eRNKhJnJr/FCfnvK3cNLH/PTPB/Jdy5cBrrKaqrgCKg= 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 1761100099226217.46895702956238; Tue, 21 Oct 2025 19:28:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBOYr-000738-FQ; Tue, 21 Oct 2025 22:26:50 -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 1vBOYp-00072W-Dw for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:26:47 -0400 Received: from mail-pl1-x630.google.com ([2607:f8b0:4864:20::630]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1vBOYn-0000xN-Fm for qemu-devel@nongnu.org; Tue, 21 Oct 2025 22:26:47 -0400 Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-290ac2ef203so62653835ad.1 for ; Tue, 21 Oct 2025 19:26:44 -0700 (PDT) Received: from jchang-1875.internal.sifive.com ([136.226.240.196]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2930340092dsm4673545ad.42.2025.10.21.19.26.40 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 21 Oct 2025 19:26:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1761100003; x=1761704803; 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=026+MkGDqz12mXQJte4DznqG5pLwCGi6DGsBZLqInuM=; b=MBjThPwnmu7jCKPZYxnytbzqw6RXp30YR0i7p7JsVmw6keoFsrNlcbY36F8oo9fuha YIKhKe9DhIOQ54cMAYGQn8iIlLboEdRd3bBWwqfiQIafOYjwLwx29HhJaOceTGoE/EmP XZNKwEp8MMJAJEkRvTRBMfmigFO+vGHJEoPnb3XtEpj+7ecsMJoeUQYJcL69TpplCQAG 9cbaBj0Sc+Vod4Qj6hwIOOsIahsn4VqGqNqHXrS1YbVz6gZOQl+QZV1Q4ILYMo8s4kTu zU+Fw3DPGXECtJpn9dO0I+wlAfj7RfzVYsyOo/a9BqM1YLjDKIdFP3LwY0o58fFLyL2z zP8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761100003; x=1761704803; 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=026+MkGDqz12mXQJte4DznqG5pLwCGi6DGsBZLqInuM=; b=HWUqO8GJ+V2OjJ9Rf/4ZqZVrjkoek8MxCS3W/g/9icugK/Fmoj6iFZ6QciAdPBwL9k eUbJ6Prd2G5s5SL06la93QO3BJXy0T0F8kime4geTpW2h2Smd38A8MzK0pM2JxTPLbxB xMXfx3UWm9SfFU2X3lE5RXigbcIlwheBVT2PaDFVqsQcSObZvQq9HgfGF+JAdLvEFPhL +5g29gGkDN1fxmPR+NXs+k8MG9vavR56zt412UZ+V4f71u1RamBhLf5muYEd+Z4eLHAv 0AoafnvwBuy5RYjg4H/ezIBNOVyG4Ee6MC7bvOoJfeee5VLcfxew2fvk1SVjYcuA1O/M az1A== X-Gm-Message-State: AOJu0YxSRRZvid3od6IEntBw6mun0BhvNOA73vFuArWMl2vnxjdCXfww 1yFjNwS3R+wfjCPX15mc8G27t8mjRefYYjLG2+JCp6t/r86mEfs6LU5DzbA6CfZtA54rlHB3vOK fg4gUFg8h1SiWr5zvM/h7mBphVbjrbp8XaMUlXmlK9jOmUNl7X54DhpTdFhSoquTlgpUMMbSDnf 5mSTTtDPx1l1Cpglij6WCZN5XZPlU8yWaSD58Nc7bm X-Gm-Gg: ASbGncv3gsWFB54CuNaEQiv7GumxPnpzUS8Y+M3n5dbf35UGU4LYK2Fs2A7dObArJD1 vkh5wfumQ14v4aS3ePrOOZXuV1fYy/ITUrmsWW61KPI0TdMHaLEUfGK8SonstDj8B/Hy9BhV2sH aEmxYf6YBaVIXQvzKWlLCj8y3kJGaNcohznoT7R4pF4fT/fvKya/9EbdOhhWIPI12i4ePt67b2b PHKMEPi7btDW++VL8AY6DIkdipIqRo5JefRfVquHDZQuoJOPWByVgcZZiPtFJUTdvGVmJc9RBrW bho69RE6gsJKtyU6omWv43mAbM6LkbfYPxs1/eWJInfDiqLgkSp/+SigLCO0NoVthHAviaY6Zfh 1IeP4YWu2U/qhrkK0qbJ85JshJhlkszauSCAeApBBSjTkUSIcq1P+X0jh9rc8+UjsUSWpyNZbwa tLgw7766E13shhww67UTP7FJkxIX9qipf21ldqAb4Z0QIDZjU7FUtEIa5k5fq8 X-Google-Smtp-Source: AGHT+IGe0oMMzK1M5FDpvkQ5kuw/v61bEieM2HI875/eYYHi08wohF7TIyB58gqpLo4hrzcnW5YRfw== X-Received: by 2002:a17:902:8e84:b0:290:c07f:e8ee with SMTP id d9443c01a7336-290cb27af18mr172092295ad.43.1761100002942; Tue, 21 Oct 2025 19:26:42 -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 v1 2/2] target/riscv: Make PMP CSRs conform to WARL constraints Date: Wed, 22 Oct 2025 10:26:25 +0800 Message-ID: <20251022022628.41307-3-jay.chang@sifive.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20251022022628.41307-1-jay.chang@sifive.com> References: <20251022022628.41307-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::630; envelope-from=jay.chang@sifive.com; helo=mail-pl1-x630.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: 1761100103314158500 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..a15265c8d2 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 && g < TARGET_LONG_BITS) { + val &=3D ~((1UL << g) - 1UL); + } + break; + case PMP_AMATCH_NAPOT: + /* Bit [g-2:0] read all one */ + if (g >=3D 2 && g < TARGET_LONG_BITS) { + val |=3D ((1UL << (g - 1)) - 1UL); + } + break; + default: + break; + } trace_pmpaddr_csr_read(env->mhartid, addr_index, val); } else { qemu_log_mask(LOG_GUEST_ERROR, --=20 2.48.1