[{"id":3675597,"web_url":"http://patchwork.ozlabs.org/comment/3675597/","msgid":"<CAKmqyKOCRdD5cUvux6W9Z_9fMXiZ0g5s1n6iWp7RkTmZBGvHXw@mail.gmail.com>","list_archive_url":null,"date":"2026-04-10T01:36:06","subject":"Re: [PATCH v5 2/6] target/riscv: Implement core SMMPT lookup logic","submitter":{"id":64571,"url":"http://patchwork.ozlabs.org/api/people/64571/","name":"Alistair Francis","email":"alistair23@gmail.com"},"content":"On Thu, Apr 9, 2026 at 12:07 AM LIU Zhiwei <zhiwei_liu@linux.alibaba.com> wrote:\n>\n> This patch introduces the core implementation for the Memory Protection Table\n> (MPT) walk, which is the central mechanism of the SMMPT extension.\n>\n> A new file, `riscv_smmpt.c`, is added to encapsulate the MPT logic. It\n> implements the `smmpt_lookup()` function, which performs a multi-level\n> page table-like walk starting from the physical address specified in the\n> `mptppn` CSR field. This walk determines the access permissions (read,\n> write, execute) for a given physical address.\n>\n> The implementation supports various SMMPT modes (SMMPT34, SMMPT43, etc.) and\n> correctly handles leaf and non-leaf entries, including reserved bit\n> checks. Helper functions for parsing MPT entries and converting access\n> permissions are also included in the new `riscv_smmpt.h` header.\n>\n> Co-authored-by: Huang Tao <eric.huang@linux.alibaba.com>\n> Co-authored-by: TANG Tiancheng <lyndra@linux.alibaba.com>\n> Signed-off-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>\n> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>\n> ---\n>  target/riscv/cpu_helper.c  |   5 +-\n>  target/riscv/meson.build   |   1 +\n>  target/riscv/pmp.h         |   3 +\n>  target/riscv/riscv_smmpt.c | 274 +++++++++++++++++++++++++++++++++++++\n>  target/riscv/riscv_smmpt.h |  15 ++\n>  5 files changed, 295 insertions(+), 3 deletions(-)\n>  create mode 100644 target/riscv/riscv_smmpt.c\n>\n> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c\n> index dd6c861a90..e3361fadae 100644\n> --- a/target/riscv/cpu_helper.c\n> +++ b/target/riscv/cpu_helper.c\n> @@ -1089,9 +1089,8 @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv, bool virt_en)\n>   * @access_type: The type of MMU access\n>   * @mode: Indicates current privilege level.\n>   */\n> -static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,\n> -                                    int size, MMUAccessType access_type,\n> -                                    int mode)\n> +int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,\n> +                             int size, MMUAccessType access_type, int mode)\n>  {\n>      pmp_priv_t pmp_priv;\n>      bool pmp_has_privs;\n> diff --git a/target/riscv/meson.build b/target/riscv/meson.build\n> index 3842c7c1a8..bd1c2e8fad 100644\n> --- a/target/riscv/meson.build\n> +++ b/target/riscv/meson.build\n> @@ -34,6 +34,7 @@ riscv_system_ss = ss.source_set()\n>  riscv_system_ss.add(files(\n>    'arch_dump.c',\n>    'pmp.c',\n> +  'riscv_smmpt.c',\n>    'debug.c',\n>    'monitor.c',\n>    'machine.c',\n> diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h\n> index 467fb6b4b1..1ed574227c 100644\n> --- a/target/riscv/pmp.h\n> +++ b/target/riscv/pmp.h\n> @@ -86,6 +86,9 @@ void pmp_update_rule_nums(CPURISCVState *env);\n>  uint32_t pmp_get_num_rules(CPURISCVState *env);\n>  int pmp_priv_to_page_prot(pmp_priv_t pmp_priv);\n>  void pmp_unlock_entries(CPURISCVState *env);\n> +int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,\n> +                             int size, MMUAccessType access_type,\n> +                             int mode);\n>\n>  #define MSECCFG_MML_ISSET(env) get_field(env->mseccfg, MSECCFG_MML)\n>  #define MSECCFG_MMWP_ISSET(env) get_field(env->mseccfg, MSECCFG_MMWP)\n> diff --git a/target/riscv/riscv_smmpt.c b/target/riscv/riscv_smmpt.c\n> new file mode 100644\n> index 0000000000..b7b47c5ae1\n> --- /dev/null\n> +++ b/target/riscv/riscv_smmpt.c\n> @@ -0,0 +1,274 @@\n> +/*\n> + * QEMU RISC-V Smmpt (Memory Protection Table)\n> + *\n> + * Copyright (c) 2024 Alibaba Group. All rights reserved.\n> + *\n> + * SPDX-License-Identifier: GPL-2.0-or-later\n> + */\n> +\n> +#include \"qemu/osdep.h\"\n> +#include \"riscv_smmpt.h\"\n> +#include \"pmp.h\"\n> +#include \"system/memory.h\"\n> +\n> +typedef uint64_t load_entry_fn(AddressSpace *, hwaddr,\n> +                               MemTxAttrs, MemTxResult *);\n> +\n> +static uint64_t load_entry_32(AddressSpace *as, hwaddr addr,\n> +                              MemTxAttrs attrs, MemTxResult *result)\n> +{\n> +    return address_space_ldl(as, addr, attrs, result);\n> +}\n> +\n> +static uint64_t load_entry_64(AddressSpace *as, hwaddr addr,\n> +                              MemTxAttrs attrs, MemTxResult *result)\n> +{\n> +    return address_space_ldq(as, addr, attrs, result);\n> +}\n> +\n> +typedef union {\n> +    uint64_t raw;\n> +    struct {\n> +        uint32_t v:1;\n> +        uint32_t l:1;\n> +        uint32_t rsv1:5;\n> +        uint32_t perms:24;\n> +        uint32_t n:1;\n> +    } leaf32;\n> +    struct {\n> +        uint32_t v:1;\n> +        uint32_t l:1;\n> +        uint32_t rsv1:8;\n> +        uint32_t ppn:22;\n> +    } nonleaf32;\n> +    struct {\n> +        uint64_t v:1;\n> +        uint64_t l:1;\n> +        uint64_t rsv1:8;\n> +        uint64_t perms:48;\n> +        uint64_t rsv2:5;\n> +        uint64_t n:1;\n> +    } leaf64;\n> +    struct {\n> +        uint64_t v:1;\n> +        uint64_t l:1;\n> +        uint64_t rsv1:8;\n> +        uint64_t ppn:52;\n> +        uint64_t rsv2:1;\n> +        uint64_t n:1;\n> +    } nonleaf64;\n> +} mpte_union_t;\n\nThere is no guarantee in C that these bit fields are packed and laid\nout like you are expecting\n\n> +\n> +static inline bool mpte_is_leaf(uint64_t mpte)\n> +{\n> +   return mpte & 0x2;\n> +}\n> +\n> +static inline bool mpte_is_valid(uint64_t mpte)\n> +{\n> +    return mpte & 0x1;\n> +}\n> +\n> +static uint64_t mpte_get_rsv(CPURISCVState *env, uint64_t mpte)\n> +{\n> +    RISCVMXL mxl = riscv_cpu_mxl(env);\n> +    bool leaf = mpte_is_leaf(mpte);\n> +    mpte_union_t *u = (mpte_union_t *)&mpte;\n\nSo this cast\n\n> +\n> +    if (mxl == MXL_RV32) {\n> +        return leaf ? u->leaf32.rsv1 : u->nonleaf32.rsv1;\n\nand these accesses are not valid.\n\nOn some platforms this will work, but on others it won't\n\nSee the notes here\nhttps://en.cppreference.com/w/cpp/language/bit_field.html for more\ndetails\n\nAlistair","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=IRuFLwJS;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fsKF34pCKz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 11:37:57 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wB0nY-00088G-Pc; Thu, 09 Apr 2026 21:36:40 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <alistair23@gmail.com>)\n id 1wB0nW-00087o-A5\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 21:36:38 -0400","from mail-ej1-x629.google.com ([2a00:1450:4864:20::629])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <alistair23@gmail.com>)\n id 1wB0nU-0001F6-4p\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 21:36:38 -0400","by mail-ej1-x629.google.com with SMTP id\n a640c23a62f3a-b982b0889d8so205423966b.2\n for <qemu-devel@nongnu.org>; Thu, 09 Apr 2026 18:36:35 -0700 (PDT)"],"ARC-Seal":"i=1; a=rsa-sha256; t=1775784994; cv=none;\n d=google.com; s=arc-20240605;\n b=jO7iqX9eqjR6/l20hpeqjwV5v1DKWrQNLnWU6jHG5bQNAkjd2g/SPeMoFfKKyMY44A\n MzaNH1WUMxNndZ6J6zL6dgwlVWZqvl8cPBGInECNHANLoKEuwgSYJ9Gdj8Khd12wJjlg\n HLjG1JwjuKsi/FhTj+k1t4wGmfSUntdw2xFMg60OVlbOwMCplX+W3kiZiJEgBIw882L/\n AVzCh1415bg4fhHCl0y//k8YjLwfLu7ugwPv2gBWhJTem4mO8fXhh4LaAj3UW40xeCAw\n XMC51IskGfXDb2M9kiS5PZ36rITQlAnS8C+jzIPv7zPK2yAomPRozLegeYvxngtMI0x6\n B29g==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:dkim-signature;\n bh=tGDHPv2KtHevCmzz0FTTj4qFv8sYfv+ejK+QThaIROE=;\n fh=cWfiSq/oFyTN/DKvcJSgQUgJ4u5YSKmpf6by/WUOfgI=;\n b=FRo+bWrhmcbZZAl11vE9ReQwO4zoZjO2NtSkvQE617p4JhyCOqgb6f+jjIrmAEm+ot\n lxYZV6TnY5maTPX95YZWngykHawUIi6NiTTXpzMlx9cIjynmvus2sYIJXTUW0CL8UDtT\n kUCx9ffTmXUDqME0VhnbgA5ep8t3u/uQ49411HIf6iet0K53+xO+zUgygPMsmvUZGiqQ\n Ty1QqVaMeDTISUvFW9XnuUr6RvRVqWyVA9/vOAiwYNE4lii18Eu6/1D/IwMSh7JnlmOa\n sEB5pEvymTG2T2XOx0WVe6GO1bGrKDtXUJrVJnlbIs9t4vys/3fzuappMnYaRPO5juRP\n nl/A==; darn=nongnu.org","ARC-Authentication-Results":"i=1; mx.google.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1775784994; x=1776389794; darn=nongnu.org;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:from:to:cc:subject:date\n :message-id:reply-to;\n bh=tGDHPv2KtHevCmzz0FTTj4qFv8sYfv+ejK+QThaIROE=;\n b=IRuFLwJSEk1enKLHrV/w6LOTLwAIVchkKpahSBfgM2E3iF9HeZLECn2tuhJzzlSI6/\n c7JFeqhIvst/yWGANEtBnQM9AzH2lJTGJ09UxYvwpDGwKhDKF25usrDc0bjlzigmS3ty\n NnG0i/CbIN+8y9JX9B/j8XRADrtOOV5nspbdOO+/ala6t4fD193MZm8/roCwGGtRcNsx\n CFpwaozYObw50ce67+pp3zhLuBjyITYdoNE6/LlW/eRnRc91cy2WF6uLNTx7bDFFu3Ox\n IFdvk7zT5ZQQUVbswzQuAPnIAS1dgaoqHfoV1j3T94waI3xNqc2TfHDHUSbK+HvZIEeo\n iRcA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775784994; x=1776389794;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=tGDHPv2KtHevCmzz0FTTj4qFv8sYfv+ejK+QThaIROE=;\n b=RRp9GifSQ+T6CpEwUYwJDJHOUiMDxjZCA0ZTEIV1EPzapfbZBo0sR4dPhcZ/BSYWTW\n SiWFjNdyJBHnUYzw87+PHNCXaAHuCMe8i7aVpI61Aksl8EOtpxDt+ICyMRCktceS4BsD\n re08zerKoDcEuKiNv0NoE/mPduX0pPscmmw/C1rVALh0aPQR+5iq1DNhCC2QWPkqF0aP\n KY3RoJ/oMAz/lFMOwcX4sDrUbAOrv3NkAmjZwk2m/OiBQH61M/FwG6zcgLRbp55AJrqf\n +Eo8FvjR3ISU/wVndHjFcfzTAwPMAZKz9gn13g7kwWxDLsvSco3whN1hRoaXi/KXUS2b\n 5sfw==","X-Gm-Message-State":"AOJu0YwcTgkcUwG6JUAoN05BBXx+48N2Ukpr5FDtlzSXtyD/7KxVjqog\n J/yA/IjF7TMJvcxMbEDPevhCI9e5U2N5x91TEanuq5j+K/UX4NS8+sVKumgP3FZcHxlFkRVO2iR\n ha3cBQkCavy4eVjJ9h2DUx0JyYI9u6Jo=","X-Gm-Gg":"AeBDiev4ql6VyDGV3ErqBdBSuEcmaM6y2CUdAJq/UEa+DUrg3FNNIHx1a5h6mov+24s\n 1aPAd6SB5wBO8JjTEf7Q7XF/7yTLEnnfv99ZlrehzMHuasNhhLs5DDrHr7EvxTzbcfnMnAfM9FF\n HuYtTxD4LGl1mRtuGPQACOW1RVqQYKpg+hhDxTRnjevaeCKZuc6aNMgR14FN0uU65ZCBB0MwRSy\n jwaDap2ruRnXxFMhJCJpME3xn8/RZydVU7NhNfPPT8pKj4feskj/+BJOa5HEig8+p46vNL43hID\n UanLzqMNgo3ydfDVfBaf7MUpzo/40Z9FH7qS7zcNaTkF3vws","X-Received":"by 2002:a17:907:1609:b0:b98:5b2:77f7 with SMTP id\n a640c23a62f3a-b9d7248ababmr79969366b.12.1775784993878; Thu, 09 Apr 2026\n 18:36:33 -0700 (PDT)","MIME-Version":"1.0","References":"<20260408140635.42546-1-zhiwei_liu@linux.alibaba.com>\n <20260408140635.42546-3-zhiwei_liu@linux.alibaba.com>","In-Reply-To":"<20260408140635.42546-3-zhiwei_liu@linux.alibaba.com>","From":"Alistair Francis <alistair23@gmail.com>","Date":"Fri, 10 Apr 2026 11:36:06 +1000","X-Gm-Features":"AQROBzDHHsIxb35Ho5tn-yp6GatJ7zLt6v2_lqT-pSh99twIheCyhnTXjGhZLGs","Message-ID":"\n <CAKmqyKOCRdD5cUvux6W9Z_9fMXiZ0g5s1n6iWp7RkTmZBGvHXw@mail.gmail.com>","Subject":"Re: [PATCH v5 2/6] target/riscv: Implement core SMMPT lookup logic","To":"LIU Zhiwei <zhiwei_liu@linux.alibaba.com>","Cc":"qemu-devel@nongnu.org, qemu-riscv@nongnu.org, chao.liu.zevorn@gmail.com,\n palmer@dabbelt.com, daniel.barboza@oss.qualcomm.com, liwei1518@gmail.com,\n Huang Tao <eric.huang@linux.alibaba.com>,\n TANG Tiancheng <lyndra@linux.alibaba.com>,\n Daniel Henrique Barboza <dbarboza@ventanamicro.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","Received-SPF":"pass client-ip=2a00:1450:4864:20::629;\n envelope-from=alistair23@gmail.com; helo=mail-ej1-x629.google.com","X-Spam_score_int":"-17","X-Spam_score":"-1.8","X-Spam_bar":"-","X-Spam_report":"(-1.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n 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":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"}},{"id":3675598,"web_url":"http://patchwork.ozlabs.org/comment/3675598/","msgid":"<2b61ae1b-0feb-47ef-a134-07030f88f92e@linaro.org>","list_archive_url":null,"date":"2026-04-10T01:41:53","subject":"Re: [PATCH v5 2/6] target/riscv: Implement core SMMPT lookup logic","submitter":{"id":72104,"url":"http://patchwork.ozlabs.org/api/people/72104/","name":"Richard Henderson","email":"richard.henderson@linaro.org"},"content":"On 4/10/26 11:36, Alistair Francis wrote:\n> On Thu, Apr 9, 2026 at 12:07 AM LIU Zhiwei <zhiwei_liu@linux.alibaba.com> wrote:\n>> +typedef union {\n>> +    uint64_t raw;\n>> +    struct {\n>> +        uint32_t v:1;\n>> +        uint32_t l:1;\n>> +        uint32_t rsv1:5;\n>> +        uint32_t perms:24;\n>> +        uint32_t n:1;\n>> +    } leaf32;\n...\n> There is no guarantee in C that these bit fields are packed and laid\n> out like you are expecting\n...\n> and these accesses are not valid.\n> \n> On some platforms this will work, but on others it won't\n> \n> See the notes here\n> https://en.cppreference.com/w/cpp/language/bit_field.html for more\n> details\n\nIndeed. Use hw/core/registerfields.h macros.\n\n\nr~","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256\n header.s=google header.b=iPlqunHj;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fsKLN2GyHz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 11:42:36 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wB0ss-0000lt-Em; Thu, 09 Apr 2026 21:42:10 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <richard.henderson@linaro.org>)\n id 1wB0sm-0000lf-Ev\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 21:42:04 -0400","from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <richard.henderson@linaro.org>)\n id 1wB0sj-0002ix-EX\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 21:42:04 -0400","by mail-pl1-x62f.google.com with SMTP id\n d9443c01a7336-2a7a9b8ed69so11818085ad.2\n for <qemu-devel@nongnu.org>; Thu, 09 Apr 2026 18:42:00 -0700 (PDT)","from [192.168.1.105] (124-150-69-109.tpgi.com.au. [124.150.69.109])\n by smtp.gmail.com with ESMTPSA id\n d9443c01a7336-2b2d4f32c76sm8402025ad.67.2026.04.09.18.41.57\n for <qemu-devel@nongnu.org>\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Thu, 09 Apr 2026 18:41:58 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linaro.org; s=google; t=1775785319; x=1776390119; darn=nongnu.org;\n h=content-transfer-encoding:in-reply-to:content-language:from\n :references:to:subject:user-agent:mime-version:date:message-id:from\n :to:cc:subject:date:message-id:reply-to;\n bh=Tu+LA7A9EJmvbExYvR6W7voJ+kdETZFnnPb+ZY2iiI0=;\n b=iPlqunHjBXiIyfOcBW7uAjawzAfr/tAkL4WrL2O2Awsa6F8FVS99vy50g0zb9RBaqP\n +9Kwz7JiZh8a2XWugVCKE8SCb2ePstooIe3W9b1UA9oybYf3M1f4dnIADeuN29LJBA4i\n K6Qo6SK33DKVt04PlBMq5XKGJPZi6mo3LM3wBqL9DWd8B9afIchnlNp4RuXfABBQoJ9v\n gGTDbAsigM2hBXA/bTYVFm5wxhm639Hu0mtdBOD7ebbEIoE9yKGOV4eNy2ABf46VnbAm\n eU77tT/i333XBF6eO+qlD6dZO36d1VojK9fQ5eooVTl1PF25bPRlFFNnxZr3uf7baR/A\n 0gWg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775785319; x=1776390119;\n h=content-transfer-encoding:in-reply-to:content-language:from\n :references:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=Tu+LA7A9EJmvbExYvR6W7voJ+kdETZFnnPb+ZY2iiI0=;\n b=psOuFldRl7LnwplhhoNc7f0hDeXQkwuwDawGz4SIh4woJ03EIR8Vu7xX2t/aSsWgR5\n 3l4m/ndWAEZElfU5Oxp+okpDvoM15APNAUX4FopQKKRYhguIluV1D0dru3zgHjqpK+VS\n kSkt6N/ZLd6UoQSAcmFp8SP4oD5CAbT672+IVEi/dBoSlmQ2F5hpRA135ktXsFP+hM5K\n 0GWUCIzvwuTx2rcPUFClUQ8iaI1NUTijqOKcykqatzzlZ9FBP2efE+qOxRcp+NyyjZ9G\n Ijk+DQtpe1aAJNK8S5NyzX89nk/RoO6BmJAHBTQbtIKCDOSSNA0lkH3RXZ6cYbmy9hbg\n WOSQ==","X-Gm-Message-State":"AOJu0Yyhu4tlp4cQ7rG9ccYZ3bQd4ln6gMgOrAN/V91rurxEKibX+Nm+\n WmP7kIKPkHBc2IWWClenwZVAmk+mUsrAna8vhUmmJQskZyD2Ej+f10zgqqPgjqwFjetK39lJeg7\n nUTXT","X-Gm-Gg":"AeBDiesAlgkjRindaWvaGwPw+8JVNF/928qa66SBVNorS9y1d1kv/G8qCpgiqgY5RPm\n qGtkgHrTvsCveW+MAL3vnEohXR5crrmwcqbowwO10U3fbBwd0XavyE2d+4RXPtaFyAc5BKXE48W\n Pj3s/0/AGztBq6BTDfFkMEbiA79PnZq3zuXvUrjc6P2u6MYJPA9GGgoS2KELVOd9TNQvGQJfac4\n esM/H2iJXyjbWG2EurjEK7iidNTufBdOk4r7MjpeJyWqbNbC77EqyfDYS69WHrkHlJengmbSbJG\n U+c89MEZIvBi3gRq9QyXPzyeHQXpw1X/wRbNEsxNLiPLKZdl0/9sEXLBRWaj3ggJw4FE2GdHfrc\n RYOQWa3e3yMfVUrUQ+VPTHZF1CDIIiaV1x2sFJXju9W6KJTPScUSdXrDQNYlBfqZaLQoxEglgq8\n dymqDD9qlH4AMunBJ/e5ngtS0JKs00Kagz/f/q/fmIX3yVyIKLsdYP8zMH+RW8SFFQIBzS9Y1H+\n 8g/Ng==","X-Received":"by 2002:a17:902:cf05:b0:2b2:42da:25c4 with SMTP id\n d9443c01a7336-2b2d59adee5mr11959555ad.14.1775785319074;\n Thu, 09 Apr 2026 18:41:59 -0700 (PDT)","Message-ID":"<2b61ae1b-0feb-47ef-a134-07030f88f92e@linaro.org>","Date":"Fri, 10 Apr 2026 11:41:53 +1000","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v5 2/6] target/riscv: Implement core SMMPT lookup logic","To":"qemu-devel@nongnu.org","References":"<20260408140635.42546-1-zhiwei_liu@linux.alibaba.com>\n <20260408140635.42546-3-zhiwei_liu@linux.alibaba.com>\n <CAKmqyKOCRdD5cUvux6W9Z_9fMXiZ0g5s1n6iWp7RkTmZBGvHXw@mail.gmail.com>","From":"Richard Henderson <richard.henderson@linaro.org>","Content-Language":"en-US","In-Reply-To":"\n <CAKmqyKOCRdD5cUvux6W9Z_9fMXiZ0g5s1n6iWp7RkTmZBGvHXw@mail.gmail.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2607:f8b0:4864:20::62f;\n envelope-from=richard.henderson@linaro.org; helo=mail-pl1-x62f.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,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n 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":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"}},{"id":3676527,"web_url":"http://patchwork.ozlabs.org/comment/3676527/","msgid":"<CANzO1D35+m_cPDmj7vDsSxfU0Z6=dC7ch_vsJw0K1hNzrqHRKw@mail.gmail.com>","list_archive_url":null,"date":"2026-04-13T08:02:06","subject":"Re: [PATCH v5 2/6] target/riscv: Implement core SMMPT lookup logic","submitter":{"id":79604,"url":"http://patchwork.ozlabs.org/api/people/79604/","name":"Frank Chang","email":"frank.chang@sifive.com"},"content":"Hi Zhiwei,\n\nLIU Zhiwei <zhiwei_liu@linux.alibaba.com> 於 2026年4月9日週四 上午3:24寫道：\n>\n> This patch introduces the core implementation for the Memory Protection Table\n> (MPT) walk, which is the central mechanism of the SMMPT extension.\n>\n> A new file, `riscv_smmpt.c`, is added to encapsulate the MPT logic. It\n> implements the `smmpt_lookup()` function, which performs a multi-level\n> page table-like walk starting from the physical address specified in the\n> `mptppn` CSR field. This walk determines the access permissions (read,\n> write, execute) for a given physical address.\n>\n> The implementation supports various SMMPT modes (SMMPT34, SMMPT43, etc.) and\n> correctly handles leaf and non-leaf entries, including reserved bit\n> checks. Helper functions for parsing MPT entries and converting access\n> permissions are also included in the new `riscv_smmpt.h` header.\n>\n> Co-authored-by: Huang Tao <eric.huang@linux.alibaba.com>\n> Co-authored-by: TANG Tiancheng <lyndra@linux.alibaba.com>\n> Signed-off-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>\n> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>\n> ---\n>  target/riscv/cpu_helper.c  |   5 +-\n>  target/riscv/meson.build   |   1 +\n>  target/riscv/pmp.h         |   3 +\n>  target/riscv/riscv_smmpt.c | 274 +++++++++++++++++++++++++++++++++++++\n>  target/riscv/riscv_smmpt.h |  15 ++\n>  5 files changed, 295 insertions(+), 3 deletions(-)\n>  create mode 100644 target/riscv/riscv_smmpt.c\n>\n> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c\n> index dd6c861a90..e3361fadae 100644\n> --- a/target/riscv/cpu_helper.c\n> +++ b/target/riscv/cpu_helper.c\n> @@ -1089,9 +1089,8 @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv, bool virt_en)\n>   * @access_type: The type of MMU access\n>   * @mode: Indicates current privilege level.\n>   */\n> -static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,\n> -                                    int size, MMUAccessType access_type,\n> -                                    int mode)\n> +int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,\n> +                             int size, MMUAccessType access_type, int mode)\n>  {\n>      pmp_priv_t pmp_priv;\n>      bool pmp_has_privs;\n> diff --git a/target/riscv/meson.build b/target/riscv/meson.build\n> index 3842c7c1a8..bd1c2e8fad 100644\n> --- a/target/riscv/meson.build\n> +++ b/target/riscv/meson.build\n> @@ -34,6 +34,7 @@ riscv_system_ss = ss.source_set()\n>  riscv_system_ss.add(files(\n>    'arch_dump.c',\n>    'pmp.c',\n> +  'riscv_smmpt.c',\n>    'debug.c',\n>    'monitor.c',\n>    'machine.c',\n> diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h\n> index 467fb6b4b1..1ed574227c 100644\n> --- a/target/riscv/pmp.h\n> +++ b/target/riscv/pmp.h\n> @@ -86,6 +86,9 @@ void pmp_update_rule_nums(CPURISCVState *env);\n>  uint32_t pmp_get_num_rules(CPURISCVState *env);\n>  int pmp_priv_to_page_prot(pmp_priv_t pmp_priv);\n>  void pmp_unlock_entries(CPURISCVState *env);\n> +int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr,\n> +                             int size, MMUAccessType access_type,\n> +                             int mode);\n>\n>  #define MSECCFG_MML_ISSET(env) get_field(env->mseccfg, MSECCFG_MML)\n>  #define MSECCFG_MMWP_ISSET(env) get_field(env->mseccfg, MSECCFG_MMWP)\n> diff --git a/target/riscv/riscv_smmpt.c b/target/riscv/riscv_smmpt.c\n> new file mode 100644\n> index 0000000000..b7b47c5ae1\n> --- /dev/null\n> +++ b/target/riscv/riscv_smmpt.c\n> @@ -0,0 +1,274 @@\n> +/*\n> + * QEMU RISC-V Smmpt (Memory Protection Table)\n> + *\n> + * Copyright (c) 2024 Alibaba Group. All rights reserved.\n> + *\n> + * SPDX-License-Identifier: GPL-2.0-or-later\n> + */\n> +\n> +#include \"qemu/osdep.h\"\n> +#include \"riscv_smmpt.h\"\n> +#include \"pmp.h\"\n> +#include \"system/memory.h\"\n> +\n> +typedef uint64_t load_entry_fn(AddressSpace *, hwaddr,\n> +                               MemTxAttrs, MemTxResult *);\n> +\n> +static uint64_t load_entry_32(AddressSpace *as, hwaddr addr,\n> +                              MemTxAttrs attrs, MemTxResult *result)\n> +{\n> +    return address_space_ldl(as, addr, attrs, result);\n> +}\n> +\n> +static uint64_t load_entry_64(AddressSpace *as, hwaddr addr,\n> +                              MemTxAttrs attrs, MemTxResult *result)\n> +{\n> +    return address_space_ldq(as, addr, attrs, result);\n> +}\n> +\n> +typedef union {\n> +    uint64_t raw;\n> +    struct {\n> +        uint32_t v:1;\n> +        uint32_t l:1;\n> +        uint32_t rsv1:5;\n> +        uint32_t perms:24;\n> +        uint32_t n:1;\n> +    } leaf32;\n> +    struct {\n> +        uint32_t v:1;\n> +        uint32_t l:1;\n> +        uint32_t rsv1:8;\n> +        uint32_t ppn:22;\n> +    } nonleaf32;\n> +    struct {\n> +        uint64_t v:1;\n> +        uint64_t l:1;\n> +        uint64_t rsv1:8;\n> +        uint64_t perms:48;\n> +        uint64_t rsv2:5;\n> +        uint64_t n:1;\n> +    } leaf64;\n> +    struct {\n> +        uint64_t v:1;\n> +        uint64_t l:1;\n> +        uint64_t rsv1:8;\n> +        uint64_t ppn:52;\n> +        uint64_t rsv2:1;\n> +        uint64_t n:1;\n> +    } nonleaf64;\n> +} mpte_union_t;\n> +\n> +static inline bool mpte_is_leaf(uint64_t mpte)\n> +{\n> +   return mpte & 0x2;\n> +}\n> +\n> +static inline bool mpte_is_valid(uint64_t mpte)\n> +{\n> +    return mpte & 0x1;\n> +}\n> +\n> +static uint64_t mpte_get_rsv(CPURISCVState *env, uint64_t mpte)\n> +{\n> +    RISCVMXL mxl = riscv_cpu_mxl(env);\n> +    bool leaf = mpte_is_leaf(mpte);\n> +    mpte_union_t *u = (mpte_union_t *)&mpte;\n> +\n> +    if (mxl == MXL_RV32) {\n> +        return leaf ? u->leaf32.rsv1 : u->nonleaf32.rsv1;\n> +    }\n> +    return leaf ? (u->leaf64.rsv1 << 5) | u->leaf64.rsv2\n> +                : (u->nonleaf64.rsv1 << 1) | u->nonleaf64.rsv2;\n> +}\n> +\n> +static uint64_t mpte_get_perms(CPURISCVState *env, uint64_t mpte)\n> +{\n> +    RISCVMXL mxl = riscv_cpu_mxl(env);\n> +    mpte_union_t *u = (mpte_union_t *)&mpte;\n> +\n> +    return (mxl == MXL_RV32) ? u->leaf32.perms : u->leaf64.perms;\n> +}\n> +\n> +static bool mpte_check_nlnapot(CPURISCVState *env, uint64_t mpte, bool *nlnapot)\n> +{\n> +    RISCVMXL mxl = riscv_cpu_mxl(env);\n> +    mpte_union_t *u = (mpte_union_t *)&mpte;\n> +    if (mxl == MXL_RV32) {\n> +        *nlnapot = false;\n> +        return true;\n> +    }\n> +    *nlnapot = u->nonleaf64.n;\n> +    return u->nonleaf64.n ? (u->nonleaf64.ppn & 0x1ff) == 0x100 : true;\n> +}\n> +\n> +static uint64_t mpte_get_ppn(CPURISCVState *env, uint64_t mpte, int pn,\n> +                             bool nlnapot)\n> +{\n> +    RISCVMXL mxl = riscv_cpu_mxl(env);\n> +    mpte_union_t *u = (mpte_union_t *)&mpte;\n> +\n> +    if (nlnapot) {\n> +        return deposit64(u->nonleaf64.ppn, 0, 9, pn & 0x1ff);\n> +    }\n> +    return (mxl == MXL_RV32) ? u->nonleaf32.ppn : u->nonleaf64.ppn;\n> +}\n> +\n> +/* Caller should assert i before call this interface */\n> +static int mpt_get_pn(hwaddr addr, int i, mpt_mode_t mode)\n> +{\n> +    if (mode == SMMPT34) {\n> +        return i == 0\n> +            ? extract64(addr, 15, 10)\n> +            : extract64(addr, 25, 9);\n> +    } else {\n> +        int offset = 16 + i * 9;\n> +        if ((mode == SMMPT64) && (i == 4)) {\n> +            return extract64(addr, offset, 12);\n> +        } else {\n> +            return extract64(addr, offset, 9);\n> +        }\n> +    }\n> +}\n> +\n> +/* Caller should assert i before call this interface */\n> +static int mpt_get_pi(hwaddr addr, int i, mpt_mode_t mode)\n> +{\n> +    if (mode == SMMPT34) {\n> +        return i == 0\n> +            ? extract64(addr, 12, 3)\n> +            : extract64(addr, 22, 3);\n> +    } else {\n> +        int offset = 16 + i * 9;\n> +        return extract64(addr, offset - 4, 4);\n> +    }\n> +}\n> +\n> +static bool smmpt_lookup(CPURISCVState *env, hwaddr addr, mpt_mode_t mode,\n> +                         mpt_access_t *allowed_access,\n> +                         MMUAccessType access_type)\n> +{\n> +    MemTxResult res;\n> +    MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;\n> +    CPUState *cs = env_cpu(env);\n> +    hwaddr mpte_addr, base = (hwaddr)env->mptppn << PGSHIFT;\n> +    load_entry_fn *load_entry;\n> +    uint32_t mptesize, levels, xwr;\n> +    int pn, pi, pmp_prot, pmp_ret;\n> +    uint64_t mpte, perms;\n> +\n> +    switch (mode) {\n> +    case SMMPT34:\n> +        load_entry = &load_entry_32; levels = 2; mptesize = 4; break;\n> +    case SMMPT43:\n> +        load_entry = &load_entry_64; levels = 3; mptesize = 8; break;\n> +        break;\n> +    case SMMPT52:\n> +        load_entry = &load_entry_64; levels = 4; mptesize = 8; break;\n> +    case SMMPT64:\n> +        load_entry = &load_entry_64; levels = 5; mptesize = 8; break;\n> +    case SMMPTBARE:\n> +        *allowed_access = ACCESS_ALLOW_RWX;\n> +        return true;\n> +    default:\n> +        g_assert_not_reached();\n> +        break;\n> +    }\n> +    for (int i = levels - 1; i >= 0 ; i--) {\n> +        /* 1. Get pn[i] as the mpt index */\n> +        pn = mpt_get_pn(addr, i, mode);\n> +        /* 2. Get mpte address and get mpte */\n> +        mpte_addr = base + pn * mptesize;\n> +        pmp_ret = get_physical_address_pmp(env, &pmp_prot, mpte_addr,\n> +                                           mptesize, MMU_DATA_LOAD, PRV_M);\n> +        if (pmp_ret != TRANSLATE_SUCCESS) {\n> +            return false;\n> +        }\n> +        mpte = load_entry(cs->as, mpte_addr, attrs, &res);\n> +        /* 3. Check valid bit and reserve bits of mpte */\n> +        if (!mpte_is_valid(mpte) || mpte_get_rsv(env, mpte)) {\n> +            return false;\n> +        }\n> +\n> +        /* 4. Process non-leaf node */\n> +        if (!mpte_is_leaf(mpte)) {\n> +            bool nlnapot = false;\n> +            if (i == 0) {\n> +                return false;\n> +            }\n> +            if (!mpte_check_nlnapot(env, mpte, &nlnapot)) {\n> +                return false;\n> +            }\n> +            base = mpte_get_ppn(env, mpte, pn, nlnapot) << PGSHIFT;\n> +            continue;\n> +        }\n> +\n> +        /* 5. Process leaf node */\n> +        pi = mpt_get_pi(addr, i, mode);\n> +        perms = mpte_get_perms(env, mpte);\n> +        xwr = (perms >> (pi * 3)) & 0x7;\n> +        switch (xwr) {\n> +        case ACCESS_ALLOW_R:\n> +            *allowed_access = ACCESS_ALLOW_R;\n> +            return access_type == MMU_DATA_LOAD;\n> +        case ACCESS_ALLOW_X:\n> +            *allowed_access = ACCESS_ALLOW_X;\n> +            return access_type == MMU_INST_FETCH;\n> +        case ACCESS_ALLOW_RX:\n> +            *allowed_access = ACCESS_ALLOW_R;\n> +            return (access_type == MMU_DATA_LOAD ||\n> +                    access_type == MMU_INST_FETCH);\n> +        case ACCESS_ALLOW_RW:\n> +            *allowed_access = ACCESS_ALLOW_RW;\n> +            return (access_type == MMU_DATA_LOAD ||\n> +                    access_type == MMU_DATA_STORE);\n> +        case ACCESS_ALLOW_RWX:\n> +            *allowed_access = ACCESS_ALLOW_RWX;\n> +            return true;\n> +        default:\n> +            return false;\n> +        }\n> +    }\n> +    return false;\n> +}\n> +\n> +bool smmpt_check_access(CPURISCVState *env, hwaddr addr,\n> +                        mpt_access_t *allowed_access, MMUAccessType access_type)\n> +{\n> +    bool mpt_has_access;\n> +    mpt_mode_t mode = env->mptmode;\n> +\n> +    mpt_has_access = smmpt_lookup(env, addr, mode,\n> +                                  allowed_access, access_type);\n> +    return mpt_has_access;\n> +}\n> +\n> +/*\n> + * Convert MPT access to TLB page privilege.\n> + */\n> +int smmpt_access_to_page_prot(mpt_access_t mpt_access)\n> +{\n> +    int prot;\n> +    switch (mpt_access) {\n> +    case ACCESS_ALLOW_R:\n> +        prot = PAGE_READ;\n> +        break;\n> +    case ACCESS_ALLOW_X:\n> +        prot = PAGE_EXEC;\n> +        break;\n> +    case ACCESS_ALLOW_RX:\n> +        prot = PAGE_READ | PAGE_EXEC;\n> +        break;\n> +    case ACCESS_ALLOW_RW:\n> +        prot = PAGE_READ | PAGE_WRITE;\n> +        break;\n> +    case ACCESS_ALLOW_RWX:\n> +        prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;\n> +        break;\n> +    default:\n> +        prot = 0;\n> +        break;\n> +    }\n> +\n> +    return prot;\n> +}\n> diff --git a/target/riscv/riscv_smmpt.h b/target/riscv/riscv_smmpt.h\n> index 74dcccf4be..0d0597f8eb 100644\n> --- a/target/riscv/riscv_smmpt.h\n> +++ b/target/riscv/riscv_smmpt.h\n> @@ -9,6 +9,9 @@\n>  #ifndef RISCV_SMMPT_H\n>  #define RISCV_SMMPT_H\n>\n> +#include \"cpu.h\"\n> +#include \"exec/mmu-access-type.h\"\n> +\n>  typedef enum {\n>      SMMPTBARE = 0,\n>      SMMPT34   = 1,\n> @@ -18,4 +21,16 @@ typedef enum {\n>      SMMPTMAX\n>  } mpt_mode_t;\n>\n> +typedef enum {\n> +    ACCESS_ALLOW_R = 0b001,\n> +    ACCESS_ALLOW_X = 0b100,\n> +    ACCESS_ALLOW_RX = 0b101 ,\n> +    ACCESS_ALLOW_RW = 0b011,\n> +    ACCESS_ALLOW_RWX = 0b111,\n> +} mpt_access_t;\n\nThe definitions of ACCESS_ALLOW_R and ACCESS_ALLOW_X are identical to\nPAGE_READ and PAGE_EXEC.\nI wonder if we really need to define an additional access type of mpt_access_t.\n\nWe can also save smmpt_access_to_page_prot() call if\nsmmpt_check_access() returns\nPAGE_READ, PAGE_WRITE, and PAGE_EXEC.\n\nRegards,\nFrank Chang\n\n> +\n> +int smmpt_access_to_page_prot(mpt_access_t mpt_access);\n> +bool smmpt_check_access(CPURISCVState *env, hwaddr addr,\n> +                        mpt_access_t *allowed_access,\n> +                        MMUAccessType access_type);\n>  #endif\n> --\n> 2.43.0\n>\n>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=sifive.com header.i=@sifive.com header.a=rsa-sha256\n header.s=google header.b=fIKb4nwM;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fvKfW4G6bz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 13 Apr 2026 18:03:30 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wCCFf-00080o-AG; Mon, 13 Apr 2026 04:02:35 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <frank.chang@sifive.com>)\n id 1wCCFd-00080T-Vf\n for qemu-devel@nongnu.org; Mon, 13 Apr 2026 04:02:33 -0400","from mail-pj1-x102d.google.com ([2607:f8b0:4864:20::102d])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <frank.chang@sifive.com>)\n id 1wCCFb-0006ad-2z\n for qemu-devel@nongnu.org; Mon, 13 Apr 2026 04:02:33 -0400","by mail-pj1-x102d.google.com with SMTP id\n 98e67ed59e1d1-35d95017a68so2562163a91.3\n for <qemu-devel@nongnu.org>; Mon, 13 Apr 2026 01:02:30 -0700 (PDT)","from mail-dl1-f49.google.com (mail-dl1-f49.google.com.\n [74.125.82.49]) by smtp.gmail.com with ESMTPSA id\n 98e67ed59e1d1-35e41bca6e9sm5020660a91.0.2026.04.13.01.02.18\n for <qemu-devel@nongnu.org>\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Mon, 13 Apr 2026 01:02:18 -0700 (PDT)","by mail-dl1-f49.google.com with SMTP id\n a92af1059eb24-12c287eb77fso3990451c88.1\n for <qemu-devel@nongnu.org>; Mon, 13 Apr 2026 01:02:18 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=sifive.com; s=google; t=1776067344; x=1776672144; darn=nongnu.org;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:from:to:cc:subject:date\n :message-id:reply-to;\n bh=4G6qwqcnW0t3xQ/0NaLYEpKBblt2QqbWXXCSjd0YTZc=;\n b=fIKb4nwMgBl92HbUcB0LH958U/OUZplqTJtUv7i2PNtrd3nsf9XG6u2ijZ5LiYqiuE\n vk1kRjSL/bK4G6yX7TPyycAkr9Uvw5kfklmrq/lbPt5FjIIS0WCOm3hZFlIzLlFY+bYL\n dB1iJyubDEOvERGExUzs2b7Ot1Lmw0rDOwQmzv2zOubhG9ZjBUtCSCzIgrWomqTcOWK4\n EPltF9Qlp7ICdvhaIOYPRpGuXqEObOu/OcoohMa0AyMpbLwGJMkb7xl1wSl+6vGbRmsd\n APzvYDLRsH5U2FgAyiASLQg7IKN0RqudufR4rdrBH/16Xb7Fy+Scd58g99p6IZ9Dw6df\n cWcg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776067344; x=1776672144;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=4G6qwqcnW0t3xQ/0NaLYEpKBblt2QqbWXXCSjd0YTZc=;\n b=CHhgsiHw8OgECyhQ6HpDjufKCDguWNKsxfiHzuOThHL7SMYtIUcbiJumY6tGRefmb5\n 1tfkToZgvW7bFJY+GwRYMrNyg7tdh26GwwRRS9vSRnpIkkpYgYTszmJG9e80/YT7Xw5i\n 2m6xpIRSBL4jzgKA9+T0vu6fH3/Lc8yd2uqJi95IfkIrikNqwA2V0bkA5XJXz/cADDIB\n NlCgFC3NhhyHEldP+TXaKchOCu+ippPSFfi1rewSm+73NlBLgiOyNO3cP6xX9RhGfvLq\n 1p8+A1zxpDeI0BVbWsbepkSwsDabY9WW6OV/F/gc0Ct71uycC2Wb/NHUV7nOGaTef4lV\n XCKQ==","X-Gm-Message-State":"AOJu0YymMWiC6pU12cihCpuLjem6d8y54aWh5gRbHYjhCCcW+/jLJCAX\n uump7CGAD9AfAql5J4RMi6Vk5Kltzv54lTdhV9Lo4D+dRvUbVFhQMpG3gOyBoP/rm40d6RKGLjo\n K0WQ6rbWYgcaaUN1Iy+Z3Ozkdd3Bi0pVn5NkS6cVkdevHS/R3UuQ5zvWVWilaW7MWHEnsl2G+tu\n 4/vlsXZwhIGx3Zg/EbHvMirx8sp2JpfZLsLc4Z3wlj214O3qkh","X-Gm-Gg":"AeBDietjqlRRQ3Sq+AVADu+JvkN4bxjGp/flvr4cguz0BARqWdbp85z2HEdQwuU+A/q\n O0TzAJsxbgWdU9qPWn3vwUDYkgL0Hv/9VakSdnh3YmZ3o+Tn/btgR3Ctki26HMQw2N0E8DmYoh5\n AHeuH5AJkKAy9/MV83FuDS+fV7iC7lNS7k1l4LC1sDq96pYnhAzpPDrEMd1zjxvY0WLGPK2nyaz\n nuPMacREz5H2lXt+LOp4xt4nspxIiuRs3La1z7rxUaQKIAt92Tcs5tQujgT7yuRI4GWb+4AKyRN\n OK2/54ywPOn1WOi9yJ6QONpMSr3BOXYbvdsCgeDFh27JBVUfDNe1BLiHowfiQPLTDPie4CUIsL2\n hWHUL3BSWDjxMyEg0fq77U8s5RrJGsDneHCvWfdZQSxd+F1ZjHYNMHRoqwXyVn1/MS2M3ZvHjLB\n p/Fei1oUmMVSu5YKf91qlpXjx1PSlZItCb4MY8DboM9dHV6brarBg1YSnQe7UGHg==","X-Received":["by 2002:a17:90b:3a8f:b0:33b:b078:d6d3 with SMTP id\n 98e67ed59e1d1-35e4283763bmr13199057a91.23.1776067343167;\n Mon, 13 Apr 2026 01:02:23 -0700 (PDT)","by 2002:a05:7023:b0f:b0:128:d6ed:e898 with SMTP id\n a92af1059eb24-12c34f09ca8mr7431488c88.29.1776067337935; Mon, 13 Apr 2026\n 01:02:17 -0700 (PDT)"],"MIME-Version":"1.0","References":"<20260408140635.42546-1-zhiwei_liu@linux.alibaba.com>\n <20260408140635.42546-3-zhiwei_liu@linux.alibaba.com>","In-Reply-To":"<20260408140635.42546-3-zhiwei_liu@linux.alibaba.com>","From":"Frank Chang <frank.chang@sifive.com>","Date":"Mon, 13 Apr 2026 16:02:06 +0800","X-Gmail-Original-Message-ID":"\n <CANzO1D35+m_cPDmj7vDsSxfU0Z6=dC7ch_vsJw0K1hNzrqHRKw@mail.gmail.com>","X-Gm-Features":"AQROBzDUpHG_5CK_VN2-KJ1PcgKs_YBnIr8-XjlV04BJp13hUKw8YHwwbPKngH0","Message-ID":"\n <CANzO1D35+m_cPDmj7vDsSxfU0Z6=dC7ch_vsJw0K1hNzrqHRKw@mail.gmail.com>","Subject":"Re: [PATCH v5 2/6] target/riscv: Implement core SMMPT lookup logic","To":"LIU Zhiwei <zhiwei_liu@linux.alibaba.com>","Cc":"qemu-devel@nongnu.org, qemu-riscv@nongnu.org, chao.liu.zevorn@gmail.com,\n palmer@dabbelt.com, alistair23@gmail.com, daniel.barboza@oss.qualcomm.com,\n liwei1518@gmail.com, Huang Tao <eric.huang@linux.alibaba.com>,\n TANG Tiancheng <lyndra@linux.alibaba.com>,\n Daniel Henrique Barboza <dbarboza@ventanamicro.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","Received-SPF":"pass client-ip=2607:f8b0:4864:20::102d;\n envelope-from=frank.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,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n 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":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"}}]