[{"id":3675599,"web_url":"http://patchwork.ozlabs.org/comment/3675599/","msgid":"<CAKmqyKMykD0tYkFnARggVLkS68arKps17tETcpH0coPL1k_FBw@mail.gmail.com>","list_archive_url":null,"date":"2026-04-10T01:44:24","subject":"Re: [PATCH v5 3/6] target/riscv: Integrate SMMPT checks into MMU and\n TLB fill","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:08 AM LIU Zhiwei <zhiwei_liu@linux.alibaba.com> wrote:\n>\n> With the core MPT lookup logic in place, this patch integrates the\n> permission checks into QEMU's main MMU processing functions.\n>\n> A new helper, `get_physical_address_mpt`, is introduced to check the\n> permissions for a given physical address against the MPT. This helper\n> is then called at two critical points:\n>\n> 1. During page table walks (`get_physical_address`): The physical\n>    address of the Page Table Entry (PTE) itself is checked to ensure\n>    the supervisor has permission to read it.\n>\n> 2. After successful address translation (`riscv_cpu_tlb_fill`): The final\n>    guest-physical address is checked against the MPT before the access\n>    is allowed to proceed.\n>\n> This ensures that SMMPT protection is enforced for both the translation\n> process and the final memory access, as required by the specification.\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 | 76 ++++++++++++++++++++++++++++++++++++++-\n>  1 file changed, 75 insertions(+), 1 deletion(-)\n>\n> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c\n> index e3361fadae..2fab00e9b4 100644\n> --- a/target/riscv/cpu_helper.c\n> +++ b/target/riscv/cpu_helper.c\n> @@ -1161,6 +1161,60 @@ static bool check_svukte_addr(CPURISCVState *env, vaddr addr)\n>      return !high_bit;\n>  }\n>\n> +/*\n> + * get_physical_address_mpt - check mpt permission for this physical address\n> + *\n> + * Lookup the Memory Protection Table and check permission for this\n> + * physical address. Returns 0 if the permission checking was successful\n> + *\n> + * @env: CPURISCVState\n> + * @prot: The returned protection attributes\n> + * @addr: The physical address to be checked permission\n> + * @access_type: The type of MMU access\n> + * @mode: Indicates current privilege level.\n> + */\n> +static int get_physical_address_mpt(CPURISCVState *env, int *prot, hwaddr addr,\n> +                                    MMUAccessType access_type, int mode)\n> +{\n> +    mpt_access_t mpt_access;\n> +    bool mpt_has_access;\n> +\n> +    /*\n> +     * If the extension is not supported or the mmpt.mode is Bare,\n> +     * there is no protection, return success.\n> +     */\n> +    if (!riscv_cpu_cfg(env)->ext_smmpt || env->mptmode == 0) {\n> +        *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;\n> +        return TRANSLATE_SUCCESS;\n> +    }\n> +\n> +    /*\n> +     * MPT is checked for all accesses to physical memory, unless the\n> +     * effective privilege mode is M.\n> +     *\n> +     * Data accesses in M-mode when the MPRV bit in mstatus is set and\n> +     * the MPP field in mstatus contains S or U are subject to MPT checks.\n> +     *\n> +     * In riscv_env_mmu_index, The MPRV and MPP bits are already checked and\n> +     * encoded to mmu_idx, So we do not need to check it here.\n> +     */\n> +    if (mode == PRV_M) {\n> +        *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;\n> +        return TRANSLATE_SUCCESS;\n> +    }\n> +\n> +    mpt_has_access = smmpt_check_access(env, addr,\n> +                                      &mpt_access, access_type);\n> +    if (!mpt_has_access) {\n> +        *prot = 0;\n> +        return TRANSLATE_MPT_FAIL;\n> +    }\n> +\n> +    *prot = smmpt_access_to_page_prot(mpt_access);\n> +\n> +    return TRANSLATE_SUCCESS;\n> +}\n> +\n>  /*\n>   * get_physical_address - get the physical address for this virtual address\n>   *\n> @@ -1355,6 +1409,13 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,\n>              pte_addr = base + idx * ptesize;\n>          }\n>\n> +        int mpt_prot;\n> +        int mpt_ret = get_physical_address_mpt(env, &mpt_prot, pte_addr,\n> +                                               MMU_DATA_LOAD, PRV_S);\n> +        if (mpt_ret != TRANSLATE_SUCCESS) {\n> +            return TRANSLATE_MPT_FAIL;\n> +        }\n> +\n>          int pmp_prot;\n>          int pmp_ret = get_physical_address_pmp(env, &pmp_prot, pte_addr,\n>                                                 sxlen_bytes,\n> @@ -1765,7 +1826,7 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,\n>      CPURISCVState *env = &cpu->env;\n>      vaddr im_address;\n>      hwaddr pa = 0;\n> -    int prot, prot2, prot_pmp;\n> +    int prot, prot2, prot_pmp, mpt_prot;\n>      bool pmp_violation = false;\n>      bool first_stage_error = true;\n>      bool two_stage_lookup = mmuidx_2stage(mmu_idx);\n> @@ -1819,6 +1880,13 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,\n>              prot &= prot2;\n>\n>              if (ret == TRANSLATE_SUCCESS) {\n> +                ret = get_physical_address_mpt(env, &mpt_prot, pa,\n> +                                               access_type, mode);\n> +                qemu_log_mask(CPU_LOG_MMU,\n> +                              \"%s MPT address=\" HWADDR_FMT_plx \" ret %d prot\"\n> +                              \" %d\\n\",\n> +                              __func__, pa, ret, mpt_prot);\n\nWe should only log if the extension is enabled\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=DbO1tveA;\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 4fsKPm71Tgz1yGb\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 11:45:31 +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 1wB0vY-0001GL-Bx; Thu, 09 Apr 2026 21:44:56 -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 1wB0vX-0001Fx-0R\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 21:44:55 -0400","from mail-ej1-x62e.google.com ([2a00:1450:4864:20::62e])\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 1wB0vV-0003Rz-9K\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 21:44:54 -0400","by mail-ej1-x62e.google.com with SMTP id\n a640c23a62f3a-b9c62fc8debso245513766b.0\n for <qemu-devel@nongnu.org>; Thu, 09 Apr 2026 18:44:52 -0700 (PDT)"],"ARC-Seal":"i=1; a=rsa-sha256; t=1775785491; cv=none;\n d=google.com; s=arc-20240605;\n b=Q7eHXk0jBkC35hDwYBGUWrwTkGJWpDXKY5ARV1BOwfU7+hol9P6QFbwXykv3TrzgTv\n lpXYJT0EBZEUcGRqOFSzZTBCnkc8NuKPa13f5fMJU+WMBhDtgWEJEaRTGrwAZpqW18hR\n 18NW0SVSFdD5HXHvWH0z2C8uWS0dLAKfIbnCC4NpUtl+BEZMxQ0lmfxZM+NAGJKmEGM6\n OErmRgf+jLXnRpAfXOcQWKD4Bzbw/O6aGBcO20inKQwB8xMmx2L7kDjin5HsPNMV/L4C\n Unkd7qCKg6MBhhSpz+S31PYO2avGeGMLodmLC/3LLRrBerTTKgJgck+9+g45d770N7py\n SfUg==","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=rZT+Mb1jCSjAhDsPiDZFx9jrAuemWWHuzZDGyhWH3zY=;\n fh=cWfiSq/oFyTN/DKvcJSgQUgJ4u5YSKmpf6by/WUOfgI=;\n b=CP4BCPMYBuQEB+1ql/kBaLz2SLTaAinu5iQFbPKsa/whcOIuZYIoCOYgy6ho/ARQ0q\n tLyfE8DvPcAsKGUUm1QZt+KKu9n/YN/99lkK98J6eSFcTbTWy2rjw2Sgkv+oTq4ff0TK\n rVrkWL7fdjoMBZHh/futiaDf6LbGtjt//YUL2UcF+PpO+g2SDoSbH/PlQntFyca8L7yk\n avIHr9XdfOhQPQLTtnErbeum84oP/UUAnGKhIVlpF3Lcb7BjM3CwGPkAQfV0H9n5jkf/\n umb77VuA1PAQ6vdginn59q1TO9qlnslwo7Y3gCygYQ9SSUkYc/mDRZXZayNziqS/UFcG\n kiBw==; 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=1775785491; x=1776390291; 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=rZT+Mb1jCSjAhDsPiDZFx9jrAuemWWHuzZDGyhWH3zY=;\n b=DbO1tveAHH3vVVhr693YbvSXPGM1b8dA9DEJSNYquns5o1ZuTHuqsIPFnDpvXsy5ot\n QHS/tiIck8NydBlacrpQ6ce1H2XSD3BMhFGEaxb6jNF5XpYbarNwCId4Jrk1ll3Mzg1f\n 6LxJKBYue8lr4P1SAvQiTN4hwt17H3k+Kvbz+KmR1ogMce3tJt70yR+K8rJENvicT0qc\n YIIrlnDklL2be++iY7Yf0Uvp/KaEDQlt7IfQgJ4v9RXssFvOmHe5DTC5ebE8/nZ6Y8cu\n jLJeq80NSbCYw/Vrb9L7M011FXD2pXCecqLsOXLPah6umNiSldCHW2C+Phh1diW9KaAT\n ITtA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775785491; x=1776390291;\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=rZT+Mb1jCSjAhDsPiDZFx9jrAuemWWHuzZDGyhWH3zY=;\n b=cmcdbRfo9dc4bnXzDc/iX68bKXxZEH/PhpujQrTxlzpPN9qfgqSDJmydBGJB3Zy5yb\n dQIzmS8iZqNaZs7zmBp7ttASNZsmueCqaAPk7UTHJEXNEvCT96oaSqbFBBwD2WZXB7yw\n i4UEvECTk+vQrz1M+Jv5pBLLUaDKk+BIc05lsSoVt86iWQsIbpiNuqrl7f5xfHV66cJI\n y57j+BdXFS1yWmz7rLM0VyWtC0a1/NHlD76SVHsi+RIIh1wKMcaQVglmkoE03uaSl0XA\n LkdxLcS2yUwf0dAs2RnAc/rCGHLLbL5PG3/vnNCN9kCAR2I+8iSHFVqVl1UJeqld4zwG\n Mc3w==","X-Gm-Message-State":"AOJu0YwSu2jj3TevFoscsQzM8Wpsxity4PLJnpjXG91XZqc9rnCTKVOA\n 8KPNo8Vh687ARu8c38asz2Sb2FDpZ459kd4nrbnBpd1lfjMwwJ6No+BB+kO+Ro3KWssOHgUDyEi\n m5BcE2WK/uLXQ1IU/YsnFVuYW6r22CYE=","X-Gm-Gg":"AeBDievLaIiPw9jpfR6bQgqYA0QwTMbG7amU/zlU/pQ6VO20wvE44Y0LsNCbRBGLeNG\n xvGdQFkAbmQEIw7E3jHcshokh+Er5P1Q5bTcwe9vzKW/BYfTzLbIrQjeyNdIO75IekxvUouSiYm\n 2NfNC9fcyaez3jLSCAGJz4h+1j6Im0TNPaS5/29NVzBnFYdtCItjYYKVMBZY0IVrM8zZOQytyR4\n XuhC5y6PzSr+zg8izKu3IdOQe+7SS/J9Wlq/jP7m1uMxJ4tXtpCBnHfsuKXvB4dvP8hDuMHcFu7\n CBsCaodLogbyt9K3PCJTm1Pm6rWu7OOcTKKeyw==","X-Received":"by 2002:a17:906:9fc5:b0:b98:443:6f33 with SMTP id\n a640c23a62f3a-b9d72ad9d36mr72862466b.51.1775785490988; Thu, 09 Apr 2026\n 18:44:50 -0700 (PDT)","MIME-Version":"1.0","References":"<20260408140635.42546-1-zhiwei_liu@linux.alibaba.com>\n <20260408140635.42546-4-zhiwei_liu@linux.alibaba.com>","In-Reply-To":"<20260408140635.42546-4-zhiwei_liu@linux.alibaba.com>","From":"Alistair Francis <alistair23@gmail.com>","Date":"Fri, 10 Apr 2026 11:44:24 +1000","X-Gm-Features":"AQROBzDpV_iVh4rrqz5172hZNcPEZIsOOP4YVkq2NszBw73rYTcuF86betU_J4Q","Message-ID":"\n <CAKmqyKMykD0tYkFnARggVLkS68arKps17tETcpH0coPL1k_FBw@mail.gmail.com>","Subject":"Re: [PATCH v5 3/6] target/riscv: Integrate SMMPT checks into MMU and\n TLB fill","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::62e;\n envelope-from=alistair23@gmail.com; helo=mail-ej1-x62e.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":3676577,"web_url":"http://patchwork.ozlabs.org/comment/3676577/","msgid":"<CANzO1D27b_t1D=WxOTJQ9_iMfCSWqVeZ6CRuDDz-U4aTQ2ioOA@mail.gmail.com>","list_archive_url":null,"date":"2026-04-13T09:02:30","subject":"Re: [PATCH v5 3/6] target/riscv: Integrate SMMPT checks into MMU and\n TLB fill","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:12寫道：\n>\n> With the core MPT lookup logic in place, this patch integrates the\n> permission checks into QEMU's main MMU processing functions.\n>\n> A new helper, `get_physical_address_mpt`, is introduced to check the\n> permissions for a given physical address against the MPT. This helper\n> is then called at two critical points:\n>\n> 1. During page table walks (`get_physical_address`): The physical\n>    address of the Page Table Entry (PTE) itself is checked to ensure\n>    the supervisor has permission to read it.\n>\n> 2. After successful address translation (`riscv_cpu_tlb_fill`): The final\n>    guest-physical address is checked against the MPT before the access\n>    is allowed to proceed.\n>\n> This ensures that SMMPT protection is enforced for both the translation\n> process and the final memory access, as required by the specification.\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 | 76 ++++++++++++++++++++++++++++++++++++++-\n>  1 file changed, 75 insertions(+), 1 deletion(-)\n>\n> diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c\n> index e3361fadae..2fab00e9b4 100644\n> --- a/target/riscv/cpu_helper.c\n> +++ b/target/riscv/cpu_helper.c\n> @@ -1161,6 +1161,60 @@ static bool check_svukte_addr(CPURISCVState *env, vaddr addr)\n>      return !high_bit;\n>  }\n>\n> +/*\n> + * get_physical_address_mpt - check mpt permission for this physical address\n> + *\n> + * Lookup the Memory Protection Table and check permission for this\n> + * physical address. Returns 0 if the permission checking was successful\n> + *\n> + * @env: CPURISCVState\n> + * @prot: The returned protection attributes\n> + * @addr: The physical address to be checked permission\n> + * @access_type: The type of MMU access\n> + * @mode: Indicates current privilege level.\n> + */\n> +static int get_physical_address_mpt(CPURISCVState *env, int *prot, hwaddr addr,\n> +                                    MMUAccessType access_type, int mode)\n> +{\n> +    mpt_access_t mpt_access;\n> +    bool mpt_has_access;\n> +\n> +    /*\n> +     * If the extension is not supported or the mmpt.mode is Bare,\n> +     * there is no protection, return success.\n> +     */\n> +    if (!riscv_cpu_cfg(env)->ext_smmpt || env->mptmode == 0) {\n\nNit: env->mptmode == SMMPTBARE\n\n> +        *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;\n> +        return TRANSLATE_SUCCESS;\n> +    }\n> +\n> +    /*\n> +     * MPT is checked for all accesses to physical memory, unless the\n> +     * effective privilege mode is M.\n> +     *\n> +     * Data accesses in M-mode when the MPRV bit in mstatus is set and\n> +     * the MPP field in mstatus contains S or U are subject to MPT checks.\n> +     *\n> +     * In riscv_env_mmu_index, The MPRV and MPP bits are already checked and\n> +     * encoded to mmu_idx, So we do not need to check it here.\n> +     */\n> +    if (mode == PRV_M) {\n> +        *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;\n> +        return TRANSLATE_SUCCESS;\n> +    }\n> +\n> +    mpt_has_access = smmpt_check_access(env, addr,\n> +                                      &mpt_access, access_type);\n> +    if (!mpt_has_access) {\n> +        *prot = 0;\n> +        return TRANSLATE_MPT_FAIL;\n> +    }\n> +\n> +    *prot = smmpt_access_to_page_prot(mpt_access);\n> +\n> +    return TRANSLATE_SUCCESS;\n> +}\n> +\n>  /*\n>   * get_physical_address - get the physical address for this virtual address\n>   *\n> @@ -1355,6 +1409,13 @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,\n>              pte_addr = base + idx * ptesize;\n>          }\n>\n> +        int mpt_prot;\n> +        int mpt_ret = get_physical_address_mpt(env, &mpt_prot, pte_addr,\n> +                                               MMU_DATA_LOAD, PRV_S);\n> +        if (mpt_ret != TRANSLATE_SUCCESS) {\n> +            return TRANSLATE_MPT_FAIL;\n\nNit: Just return mpt_ret;\n\n> +        }\n> +\n>          int pmp_prot;\n>          int pmp_ret = get_physical_address_pmp(env, &pmp_prot, pte_addr,\n>                                                 sxlen_bytes,\n> @@ -1765,7 +1826,7 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,\n>      CPURISCVState *env = &cpu->env;\n>      vaddr im_address;\n>      hwaddr pa = 0;\n> -    int prot, prot2, prot_pmp;\n> +    int prot, prot2, prot_pmp, mpt_prot;\n>      bool pmp_violation = false;\n>      bool first_stage_error = true;\n>      bool two_stage_lookup = mmuidx_2stage(mmu_idx);\n> @@ -1819,6 +1880,13 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,\n>              prot &= prot2;\n>\n>              if (ret == TRANSLATE_SUCCESS) {\n> +                ret = get_physical_address_mpt(env, &mpt_prot, pa,\n> +                                               access_type, mode);\n> +                qemu_log_mask(CPU_LOG_MMU,\n> +                              \"%s MPT address=\" HWADDR_FMT_plx \" ret %d prot\"\n> +                              \" %d\\n\",\n> +                              __func__, pa, ret, mpt_prot);\n> +                prot &= mpt_prot;\n\nWe didn't check the return value of get_physical_address_mpt().\nSo it might that get_physical_address_mpt() returns TRANSLATE_MPT_FAIL,\nbut get_physical_address_pmp() returns TRANSLATE_SUCCESS.\nThe final ret will become: TRANSLATE_SUCCESS.\n\n>                  ret = get_physical_address_pmp(env, &prot_pmp, pa,\n>                                                 size, access_type, mode);\n>                  tlb_size = pmp_get_tlb_size(env, pa);\n> @@ -1854,6 +1922,12 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,\n>                        __func__, address, ret, pa, prot);\n>\n>          if (ret == TRANSLATE_SUCCESS) {\n> +            ret = get_physical_address_mpt(env, &mpt_prot, pa,\n> +                                           access_type, mode);\n> +            qemu_log_mask(CPU_LOG_MMU,\n> +                          \"%s MPT address=\" HWADDR_FMT_plx \" ret %d prot %d\\n\",\n> +                          __func__, pa, ret, mpt_prot);\n> +            prot &= mpt_prot;\n>              ret = get_physical_address_pmp(env, &prot_pmp, pa,\n>                                             size, access_type, mode);\n>              tlb_size = pmp_get_tlb_size(env, pa);\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=X56RXcmC;\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 4fvLzN0W6rz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 13 Apr 2026 19:03:12 +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 1wCDC4-0002zQ-52; Mon, 13 Apr 2026 05:02:56 -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 1wCDBz-0002z6-7r\n for qemu-devel@nongnu.org; Mon, 13 Apr 2026 05:02:51 -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 1wCDBw-0004OL-7f\n for qemu-devel@nongnu.org; Mon, 13 Apr 2026 05:02:50 -0400","by mail-pj1-x102d.google.com with SMTP id\n 98e67ed59e1d1-35f9ab079bdso561855a91.2\n for <qemu-devel@nongnu.org>; Mon, 13 Apr 2026 02:02:47 -0700 (PDT)","from mail-dl1-f41.google.com (mail-dl1-f41.google.com.\n [74.125.82.41]) by smtp.gmail.com with ESMTPSA id\n d9443c01a7336-2b45d1ab540sm38530655ad.40.2026.04.13.02.02.43\n for <qemu-devel@nongnu.org>\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Mon, 13 Apr 2026 02:02:45 -0700 (PDT)","by mail-dl1-f41.google.com with SMTP id\n a92af1059eb24-12c1a170a50so3720080c88.0\n for <qemu-devel@nongnu.org>; Mon, 13 Apr 2026 02:02:43 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=sifive.com; s=google; t=1776070966; x=1776675766; 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=Gb0aen+HfLufr9KOgmTBTBmnsTBMLfNSRGkag2aucNw=;\n b=X56RXcmCPYhAlbeVBcnfTaXVw7IXE2Y44ELfmQ5tCeEUmYe8am9rxgD2LTFshrdXsG\n cOHLNDXVSAmfCjRVkngG9++huKTI77Ev71/vsPrrV2IoDcKbpE3TZ89tRi9ZUtYsLzaB\n yfBdHJUtF4FdafxB2IZn5NfBFPuGIhDmX37BM8b8yBN9W/QxZ+f6SHOOAQYWnaVtuPSt\n hj6GeDcV3zlwdFrkB57LtSih1AS4Xyx4M5UNRdLnnGB5mrueR7jC+q2QVRedlgtnz8iC\n mEJvUziv33gQjC5UcOR503hkpf94YVv377Y4TpsIWXBpvKe0Ggx592gZsEa8UlR0BwTk\n 0O+w==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776070966; x=1776675766;\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=Gb0aen+HfLufr9KOgmTBTBmnsTBMLfNSRGkag2aucNw=;\n b=OfYS0JXRFShxLxd0/6bOyigjp6jGCZwlAxrRxdiR4wRjn3AMAUTkVonCzGABSyveXU\n Tero05AtXNSuqnXAsPapqvBPngdArXGnPnPBbhJ69D81cmmkk1chLsbIgfcgFs3RFMwo\n XKrFwwWM1hvmi0c/HyKXT164MtDBzwgRyKMV2e0sbFlWrIXVr9epdQb47tWYzUWk7dBi\n Ki/bZEaaO53s8XqTW1Ob+mBHlH3ZnmsQfj/Y/PTtPjnYnSiihy44Uyhr4on5JzLrj+DY\n q071RKSddz7qtbeuAQyPIynB5DcGZlOtB/Zby4Td66kdmQG6+C3dtIixLmshC7JMQxVj\n yQfw==","X-Gm-Message-State":"AOJu0YyU5iRZvrgDjSnWSt2p5MmU14AFFZbHZeeMAz+Su3//WW04g2hM\n cQGU9rrXZkk0P6cLn1DM/AkZsXGuWC7/S6o6KqOGj8ZpLwQniDfKd9/kLkrNFFXao6rLyzJp7cu\n CIP3ma3mWpPa2pYlnzjNTvqGg9eLOJ6SV6pWAIAdMM1cA0N40wOlNJ1u7zKCqNeGK15JkDJlnD0\n 018dK+lh8sKmp5+uxYUksw1sCbA5zpW2cuDjjkADqyhYf3zstn","X-Gm-Gg":"AeBDies7OPiR5tl2NybwbrMbRqyTagHWkfKfvAvEwwm7Z0U0FD4e8+RAw/TPS/ZGOWJ\n qukm6q5gG047BySyTKjc22NzsMcQXCw72NC9tANHOrBv6h9qiYAG6b0BgbPmq/GY287y3/g5U+K\n p3vcqPXpoAlSI1QOAG82QWSlfEFY3M9TaTJ8JLoUPE8l+lTt3xjjGsdAreMInl/mZj+2OG9Fehd\n olYMvT08FXHqNNW2EbfuERC47Y/jrTmYjDBvoGPb6ch4ZoIhEGt2aKYCv8tqy133f0QjTWosbA+\n xxs0ohAIqf8bSvE/mtaIM8N7mNbi2sE5DTgvwMr6kt8rPInm9zsCYeP/akYM0dz/l3QGfum8+y4\n OWtM8b7i6aQiNkWzIU5Y6gmho6UgUNAZ3M6f9aeoRzO9EPGSOKfVSVObbO1a0FacQQK/ptcpoz4\n uMGgf6PN/w+EhxW8vmCwb/BAwvI24wJSuEd3Oz4Hj7F3qytm7ShQ3czP+dYL0t3Xr50++qgN/x","X-Received":["by 2002:a17:90b:1a90:b0:35f:b5df:453 with SMTP id\n 98e67ed59e1d1-35fb5df0dcbmr3331646a91.22.1776070965670;\n Mon, 13 Apr 2026 02:02:45 -0700 (PDT)","by 2002:a05:7022:3d12:b0:128:bf5f:7073 with SMTP id\n a92af1059eb24-12c34ee9ef0mr7092659c88.24.1776070962192; Mon, 13 Apr 2026\n 02:02:42 -0700 (PDT)"],"MIME-Version":"1.0","References":"<20260408140635.42546-1-zhiwei_liu@linux.alibaba.com>\n <20260408140635.42546-4-zhiwei_liu@linux.alibaba.com>","In-Reply-To":"<20260408140635.42546-4-zhiwei_liu@linux.alibaba.com>","From":"Frank Chang <frank.chang@sifive.com>","Date":"Mon, 13 Apr 2026 17:02:30 +0800","X-Gmail-Original-Message-ID":"\n <CANzO1D27b_t1D=WxOTJQ9_iMfCSWqVeZ6CRuDDz-U4aTQ2ioOA@mail.gmail.com>","X-Gm-Features":"AQROBzDds8bPtyCaNw6XuCbTBEf1tg_rCDa0v1nOW5jmFYrYICbw9gwL8Q3q8ig","Message-ID":"\n <CANzO1D27b_t1D=WxOTJQ9_iMfCSWqVeZ6CRuDDz-U4aTQ2ioOA@mail.gmail.com>","Subject":"Re: [PATCH v5 3/6] target/riscv: Integrate SMMPT checks into MMU and\n TLB fill","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=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"}}]