From nobody Sat May 30 17:44:41 2026 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=none dis=none) header.from=linux.alibaba.com ARC-Seal: i=1; a=rsa-sha256; t=1778504940; cv=none; d=zohomail.com; s=zohoarc; b=H7fu5HD1R0eUmAJn8R95rPKM2GTHBQRdZtqkkBmcB6kCw7oB/F8KQCa0med+TfkGjTR0cFLT/+u63+cTlyEa5Xc02BaRKtrooEE31/jS0iE5M4OxoCj7oXqEw07T/TPG091aTabLd1nGIrjP5p9VPYLGofwpFNwMlskxdF5mwJA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778504940; 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=MWmaeJFvQumaMB3al4y7CxTUj117LGo9Tcct9VUEYJo=; b=QoIU3GO9ZfWHyuqGZ4q7lFAJHCIfvUkZUO+5bzeuF18gXpSsYQJGeKT7LnmIOcoZJrS6d50J+Z3/mYroEA2zoWg+aoXPKceeW1ZIw/Zg8zNhtht8uK+6Okt9gPJCGL3Oxn6+wVXTzcvF7Y+PAGqdGaFb0VWKmoacwfsmP0qD16A= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778504939966705.7774170777301; Mon, 11 May 2026 06:08:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMQ3M-0007gl-Pb; Mon, 11 May 2026 08:48:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ3D-0007eO-OA; Mon, 11 May 2026 08:48:02 -0400 Received: from out30-100.freemail.mail.aliyun.com ([115.124.30.100]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ3A-0000EX-Bd; Mon, 11 May 2026 08:47:59 -0400 Received: from localhost.localdomain(mailfrom:zhiwei_liu@linux.alibaba.com fp:SMTPD_---0X2jPzTs_1778503668 cluster:ay36) by smtp.aliyun-inc.com; Mon, 11 May 2026 20:47:49 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1778503670; h=From:To:Subject:Date:Message-Id:MIME-Version; bh=MWmaeJFvQumaMB3al4y7CxTUj117LGo9Tcct9VUEYJo=; b=ciHnoanORNRbxQlje9x6fWHIQ4ZMFSHawZSGlxXw6KUy6MEHJR+j1FHXFjHVD1tl3TUB1Aijs1ug2gvAUJpblyMXUD0d/+zN881Na2PFpquCf11++MiqYYv4q0P7R6uHcP7DDHRueJWOLovoPcuanTzf4vb0BVfHFl7tYMzVLUs= X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R421e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=maildocker-contentspam033045098064; MF=zhiwei_liu@linux.alibaba.com; NM=1; PH=DS; RN=13; SR=0; TI=SMTPD_---0X2jPzTs_1778503668; From: LIU Zhiwei To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, palmer@dabbelt.com, alistair.francis@wdc.com, daniel.barboza@oss.qualcomm.com, chao.liu.zevorn@gmail.com, liwei1518@gmail.com, LIU Zhiwei , Huang Tao , TANG Tiancheng , Daniel Henrique Barboza , Frank Chang , Nutty Liu Subject: [PATCH v6 1/6] target/riscv: Add basic definitions and CSRs for SMMPT Date: Mon, 11 May 2026 20:47:00 +0800 Message-Id: <20260511124705.28161-2-zhiwei_liu@linux.alibaba.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.com> References: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.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=lists1p.gnu.org; Received-SPF: pass client-ip=115.124.30.100; envelope-from=zhiwei_liu@linux.alibaba.com; helo=out30-100.freemail.mail.aliyun.com X-Spam_score_int: -174 X-Spam_score: -17.5 X-Spam_bar: ----------------- X-Spam_report: (-17.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 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 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 @linux.alibaba.com) X-ZM-MESSAGEID: 1778504943256154100 Content-Type: text/plain; charset="utf-8" This patch lays the groundwork for the SMMPT (Supervisor Domains Access Protection) extension by introducing its fundamental components. It adds: - New CPU configuration flags, `ext_smmpt` and `ext_smsdid`, to enable the extension. - Bit-field definitions for the `mmpt` CSR in `cpu_bits.h`. - The `mmpt` and `msdcfg` CSR numbers and their read/write handlers in `csr.c`. - New fields in `CPUArchState` to store the state of these new CSRs. - A new translation failure reason `TRANSLATE_MPT_FAIL`. This provides the necessary infrastructure for the core MPT logic and MMU integration that will follow. Co-authored-by: Huang Tao Co-authored-by: TANG Tiancheng Signed-off-by: LIU Zhiwei Reviewed-by: Daniel Henrique Barboza Acked-by: Alistair Francis Reviewed-by: Frank Chang Reviewed-by: Nutty Liu Reviewed-by: Chao Liu --- target/riscv/cpu.h | 9 ++- target/riscv/cpu_bits.h | 18 ++++++ target/riscv/cpu_cfg_fields.h.inc | 2 + target/riscv/csr.c | 95 +++++++++++++++++++++++++++++++ target/riscv/riscv_smmpt.h | 21 +++++++ 5 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 target/riscv/riscv_smmpt.h diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index e42f369408..d1fb5c1909 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -130,7 +130,8 @@ enum { TRANSLATE_SUCCESS, TRANSLATE_FAIL, TRANSLATE_PMP_FAIL, - TRANSLATE_G_STAGE_FAIL + TRANSLATE_G_STAGE_FAIL, + TRANSLATE_MPT_FAIL }; =20 /* Extension context status */ @@ -181,6 +182,7 @@ extern RISCVCPUImpliedExtsRule *riscv_multi_ext_implied= _rules[]; #if !defined(CONFIG_USER_ONLY) #include "pmp.h" #include "debug.h" +#include "riscv_smmpt.h" #endif =20 #define RV_VLEN_MAX 1024 @@ -481,6 +483,11 @@ struct CPUArchState { uint64_t hstateen[SMSTATEEN_MAX_COUNT]; uint64_t sstateen[SMSTATEEN_MAX_COUNT]; uint64_t henvcfg; + /* Smsdid */ + uint32_t mptmode; + uint32_t sdid; + uint64_t mptppn; + uint32_t msdcfg; #endif =20 /* Fields from here on are preserved across CPU reset. */ diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h index b62dd82fe7..70835e0d73 100644 --- a/target/riscv/cpu_bits.h +++ b/target/riscv/cpu_bits.h @@ -1164,4 +1164,22 @@ typedef enum CTRType { #define MCONTEXT64 0x0000000000001FFFULL #define MCONTEXT32_HCONTEXT 0x0000007F #define MCONTEXT64_HCONTEXT 0x0000000000003FFFULL + +/* Smsdid */ +#define CSR_MMPT 0xbc0 +#define CSR_MSDCFG 0xbd1 + +#define MMPT_MODE_MASK_32 0xC0000000 +#define MMPT_SDID_MASK_32 0x3F000000 +#define MMPT_PPN_MASK_32 0x003FFFFF + +#define MMPT_MODE_SHIFT_32 30 +#define MMPT_SDID_SHIFT_32 24 + +#define MMPT_MODE_MASK_64 0xF000000000000000ULL +#define MMPT_SDID_MASK_64 0x0FC0000000000000ULL +#define MMPT_PPN_MASK_64 0x000FFFFFFFFFFFFFULL + +#define MMPT_MODE_SHIFT_64 60 +#define MMPT_SDID_SHIFT_64 54 #endif diff --git a/target/riscv/cpu_cfg_fields.h.inc b/target/riscv/cpu_cfg_field= s.h.inc index 734fa079f2..e30c97cf74 100644 --- a/target/riscv/cpu_cfg_fields.h.inc +++ b/target/riscv/cpu_cfg_fields.h.inc @@ -63,6 +63,8 @@ BOOL_FIELD(ext_smpmpmt) BOOL_FIELD(ext_svrsw60t59b) BOOL_FIELD(ext_svvptc) BOOL_FIELD(ext_svukte) +BOOL_FIELD(ext_smmpt) +BOOL_FIELD(ext_smsdid) BOOL_FIELD(ext_zdinx) BOOL_FIELD(ext_zaamo) BOOL_FIELD(ext_zacas) diff --git a/target/riscv/csr.c b/target/riscv/csr.c index da366cf562..1d99bc7884 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -806,6 +806,15 @@ static RISCVException rnmi(CPURISCVState *env, int csr= no) =20 return RISCV_EXCP_ILLEGAL_INST; } + +static RISCVException smsdid(CPURISCVState *env, int csrno) +{ + if (riscv_cpu_cfg(env)->ext_smsdid) { + return RISCV_EXCP_NONE; + } + + return RISCV_EXCP_ILLEGAL_INST; +} #endif =20 static RISCVException seed(CPURISCVState *env, int csrno) @@ -5511,6 +5520,89 @@ static RISCVException write_mnstatus(CPURISCVState *= env, int csrno, return RISCV_EXCP_NONE; } =20 +static RISCVException read_mmpt(CPURISCVState *env, int csrno, + target_ulong *val) +{ + if (riscv_cpu_xlen(env) =3D=3D 32) { + uint32_t value =3D 0; + value |=3D env->mptmode << MMPT_MODE_SHIFT_32; + value |=3D (env->sdid << MMPT_SDID_SHIFT_32) & MMPT_SDID_MASK_32; + value |=3D env->mptppn & MMPT_PPN_MASK_32; + *val =3D value; + } else if (riscv_cpu_xlen(env) =3D=3D 64) { + uint64_t value_64 =3D 0; + uint32_t mode_value =3D env->mptmode; + /* mpt_mode_t convert to mmpt.mode value */ + if (mode_value) { + mode_value -=3D SMMPT43 - SMMPT34; + } + value_64 |=3D (uint64_t)mode_value << MMPT_MODE_SHIFT_64; + value_64 |=3D ((uint64_t)env->sdid << MMPT_SDID_SHIFT_64) + & MMPT_SDID_MASK_64; + value_64 |=3D (uint64_t)env->mptppn & MMPT_PPN_MASK_64; + *val =3D value_64; + } else { + return RISCV_EXCP_ILLEGAL_INST; + } + return RISCV_EXCP_NONE; +} + +static RISCVException write_mmpt(CPURISCVState *env, int csrno, + target_ulong val, uintptr_t ra) +{ + uint32_t mode_value =3D 0; + if (!riscv_cpu_cfg(env)->ext_smmpt) { + goto set_remaining_fields_zero; + } + + if (riscv_cpu_xlen(env) =3D=3D 32) { + mode_value =3D (val & MMPT_MODE_MASK_32) >> MMPT_MODE_SHIFT_32; + /* If mode is bare, the remaining fields in mmpt must be zero */ + if (mode_value =3D=3D SMMPTBARE) { + goto set_remaining_fields_zero; + } else if (mode_value <=3D SMMPT34) { + /* Only write the legal value */ + env->mptmode =3D mode_value; + } + env->sdid =3D (val & MMPT_SDID_MASK_32) >> MMPT_SDID_SHIFT_32; + env->mptppn =3D val & MMPT_PPN_MASK_32; + } else if (riscv_cpu_xlen(env) =3D=3D 64) { + mode_value =3D (val & MMPT_MODE_MASK_64) >> MMPT_MODE_SHIFT_64; + if (mode_value =3D=3D SMMPTBARE) { + goto set_remaining_fields_zero; + } else if (mode_value < SMMPTMAX) { + /* convert to mpt_mode_t */ + mode_value +=3D SMMPT43 - SMMPT34; + env->mptmode =3D mode_value; + } + env->sdid =3D (val & MMPT_SDID_MASK_64) >> MMPT_SDID_SHIFT_64; + env->mptppn =3D val & MMPT_PPN_MASK_64; + } else { + return RISCV_EXCP_ILLEGAL_INST; + } + return RISCV_EXCP_NONE; + +set_remaining_fields_zero: + env->sdid =3D 0; + env->mptmode =3D SMMPTBARE; + env->mptppn =3D 0; + return RISCV_EXCP_NONE; +} + +static RISCVException read_msdcfg(CPURISCVState *env, int csrno, + target_ulong *val) +{ + *val =3D env->msdcfg; + return RISCV_EXCP_NONE; +} + +static RISCVException write_msdcfg(CPURISCVState *env, int csrno, + target_ulong val, uintptr_t ra) +{ + env->msdcfg =3D val; + return RISCV_EXCP_NONE; +} + #endif =20 /* Crypto Extension */ @@ -6725,6 +6817,9 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] =3D { write_mhpmcounterh }, [CSR_SCOUNTOVF] =3D { "scountovf", sscofpmf, read_scountovf, .min_priv_ver =3D PRIV_VERSION_1_12_0 }, + /* Supervisor Domain Identifier and Protection Registers */ + [CSR_MMPT] =3D { "mmpt", smsdid, read_mmpt, write_mmpt }, + [CSR_MSDCFG] =3D { "msdcfg", smsdid, read_msdcfg, write_msdcfg }, =20 #endif /* !CONFIG_USER_ONLY */ }; diff --git a/target/riscv/riscv_smmpt.h b/target/riscv/riscv_smmpt.h new file mode 100644 index 0000000000..74dcccf4be --- /dev/null +++ b/target/riscv/riscv_smmpt.h @@ -0,0 +1,21 @@ +/* + * QEMU RISC-V Smmpt (Memory Protection Table) + * + * Copyright (c) 2024 Alibaba Group. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef RISCV_SMMPT_H +#define RISCV_SMMPT_H + +typedef enum { + SMMPTBARE =3D 0, + SMMPT34 =3D 1, + SMMPT43 =3D 2, + SMMPT52 =3D 3, + SMMPT64 =3D 4, + SMMPTMAX +} mpt_mode_t; + +#endif --=20 2.43.0 From nobody Sat May 30 17:44:41 2026 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=none dis=none) header.from=linux.alibaba.com ARC-Seal: i=1; a=rsa-sha256; t=1778505145; cv=none; d=zohomail.com; s=zohoarc; b=EDVJiC67tVQzNimrvuI+ArlvR4rv20R6J1NYAkH61r8h0cIqigJthrtGsoqnKSqm8yFntnPU7a9ULsEiu9Z3RBzx6MN1K2NB5puHxzurheBJwdHJYoofCAmDmDOcBs/+DV+tdZCvsVfuuvzBZc97M15D3YzfUypfo+eIvkuAZV0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778505145; 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=XIO88KH9Y6vGgIPm9dbHrNrVu2WE3uu60szC1b1egbc=; b=Q9p6AZAfgnBdipkagL2iJCv3unG7eH2Vb7d8ifCtJsGC05VF3Krp8+6groEX80DQOId1aOV67MgpGO4YS+tkIgE1CfyH3ZX0KnUL54qQFhSdf40hMM8xa80WCllKQFaOe7twRnYbsQg++OZp63me2/gS5Ko0OdrN79bMTwOl9rQ= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177850514581819.8906403169741; Mon, 11 May 2026 06:12:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMQ3n-0008D9-As; Mon, 11 May 2026 08:48:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ3i-00085I-JO; Mon, 11 May 2026 08:48:30 -0400 Received: from out30-124.freemail.mail.aliyun.com ([115.124.30.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ3f-00014v-FC; Mon, 11 May 2026 08:48:30 -0400 Received: from localhost.localdomain(mailfrom:zhiwei_liu@linux.alibaba.com fp:SMTPD_---0X2k9qjz_1778503700 cluster:ay36) by smtp.aliyun-inc.com; Mon, 11 May 2026 20:48:20 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1778503702; h=From:To:Subject:Date:Message-Id:MIME-Version; bh=XIO88KH9Y6vGgIPm9dbHrNrVu2WE3uu60szC1b1egbc=; b=RKWiidIUNUhbkXMH68U7LiGIi6E7AOdIwGgEeTUkCTnb+VuZY9gnWePlYCA9Mu1YGHNPgPNNafb2Ldq3a89bkgevMyqzUnwgdV0khFxvDgS2Zadv0RwYLlWDp645SgPSJbN8bpY1T0x8JbZvUS00XrpUxm2sBOBWQkPQvGEOYfA= X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R831e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=maildocker-contentspam033037026112; MF=zhiwei_liu@linux.alibaba.com; NM=1; PH=DS; RN=11; SR=0; TI=SMTPD_---0X2k9qjz_1778503700; From: LIU Zhiwei To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, palmer@dabbelt.com, alistair.francis@wdc.com, daniel.barboza@oss.qualcomm.com, chao.liu.zevorn@gmail.com, liwei1518@gmail.com, LIU Zhiwei , Huang Tao , TANG Tiancheng , Daniel Henrique Barboza Subject: [PATCH v6 2/6] target/riscv: Implement core SMMPT lookup logic Date: Mon, 11 May 2026 20:47:01 +0800 Message-Id: <20260511124705.28161-3-zhiwei_liu@linux.alibaba.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.com> References: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.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=lists1p.gnu.org; Received-SPF: pass client-ip=115.124.30.124; envelope-from=zhiwei_liu@linux.alibaba.com; helo=out30-124.freemail.mail.aliyun.com X-Spam_score_int: -174 X-Spam_score: -17.5 X-Spam_bar: ----------------- X-Spam_report: (-17.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 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 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 @linux.alibaba.com) X-ZM-MESSAGEID: 1778505149034154100 Content-Type: text/plain; charset="utf-8" This patch introduces the core implementation for the Memory Protection Tab= le (MPT) walk, which is the central mechanism of the SMMPT extension. A new file, `riscv_smmpt.c`, is added to encapsulate the MPT logic. It implements the `smmpt_lookup()` function, which performs a multi-level page table-like walk starting from the physical address specified in the `mptppn` CSR field. This walk determines the access permissions (read, write, execute) for a given physical address. The implementation supports various SMMPT modes (SMMPT34, SMMPT43, etc.) and correctly handles leaf and non-leaf entries, including reserved bit checks. Helper functions for parsing MPT entries and converting access permissions are also included in the new `riscv_smmpt.h` header. Co-authored-by: Huang Tao Co-authored-by: TANG Tiancheng Signed-off-by: LIU Zhiwei Reviewed-by: Daniel Henrique Barboza Reviewed-by: Chao Liu Reviewed-by: Nutty Liu --- target/riscv/cpu_helper.c | 5 +- target/riscv/meson.build | 1 + target/riscv/pmp.h | 3 + target/riscv/riscv_smmpt.c | 227 +++++++++++++++++++++++++++++++++++++ target/riscv/riscv_smmpt.h | 5 + 5 files changed, 238 insertions(+), 3 deletions(-) create mode 100644 target/riscv/riscv_smmpt.c diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index 39c3486ae0..d0f0e77dfe 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -1139,9 +1139,8 @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ul= ong newpriv, bool virt_en) * @access_type: The type of MMU access * @mode: Indicates current privilege level. */ -static int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr = addr, - int size, MMUAccessType access_type, - int mode) +int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr, + int size, MMUAccessType access_type, int mode) { pmp_priv_t pmp_priv; bool pmp_has_privs; diff --git a/target/riscv/meson.build b/target/riscv/meson.build index 79f36abd63..568ea4bd88 100644 --- a/target/riscv/meson.build +++ b/target/riscv/meson.build @@ -35,6 +35,7 @@ riscv_system_ss =3D ss.source_set() riscv_system_ss.add(files( 'arch_dump.c', 'pmp.c', + 'riscv_smmpt.c', 'debug.c', 'monitor.c', 'machine.c', diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h index 17307ef88a..02d6d712ba 100644 --- a/target/riscv/pmp.h +++ b/target/riscv/pmp.h @@ -87,6 +87,9 @@ void pmp_update_rule_nums(CPURISCVState *env); uint32_t pmp_get_num_rules(CPURISCVState *env); int pmp_priv_to_page_prot(pmp_priv_t pmp_priv); void pmp_unlock_entries(CPURISCVState *env); +int get_physical_address_pmp(CPURISCVState *env, int *prot, hwaddr addr, + int size, MMUAccessType access_type, + int mode); =20 #define MSECCFG_MML_ISSET(env) get_field(env->mseccfg, MSECCFG_MML) #define MSECCFG_MMWP_ISSET(env) get_field(env->mseccfg, MSECCFG_MMWP) diff --git a/target/riscv/riscv_smmpt.c b/target/riscv/riscv_smmpt.c new file mode 100644 index 0000000000..3e9eccf70e --- /dev/null +++ b/target/riscv/riscv_smmpt.c @@ -0,0 +1,227 @@ +/* + * QEMU RISC-V Smmpt (Memory Protection Table) + * + * Copyright (c) 2024 Alibaba Group. All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "riscv_smmpt.h" +#include "pmp.h" +#include "exec/page-protection.h" +#include "system/memory.h" + +typedef uint64_t load_entry_fn(AddressSpace *, hwaddr, + MemTxAttrs, MemTxResult *); + +static uint64_t load_entry_32(AddressSpace *as, hwaddr addr, + MemTxAttrs attrs, MemTxResult *result) +{ + return address_space_ldl_le(as, addr, attrs, result); +} + +static uint64_t load_entry_64(AddressSpace *as, hwaddr addr, + MemTxAttrs attrs, MemTxResult *result) +{ + return address_space_ldq_le(as, addr, attrs, result); +} + +/* + * MPT entry bit field positions: + * + * 32-bit leaf: v[0], l[1], rsv1[6:2], perms[30:7], n[31] + * 32-bit nonleaf: v[0], l[1], rsv1[9:2], ppn[31:10] + * 64-bit leaf: v[0], l[1], rsv1[9:2], perms[57:10], rsv2[62:58], n[63] + * 64-bit nonleaf: v[0], l[1], rsv1[9:2], ppn[61:10], rsv2[62], n[63] + */ + +static inline bool mpte_is_leaf(uint64_t mpte) +{ + return mpte & 0x2; +} + +static inline bool mpte_is_valid(uint64_t mpte) +{ + return mpte & 0x1; +} + +static uint64_t mpte_get_rsv(CPURISCVState *env, uint64_t mpte) +{ + RISCVMXL mxl =3D riscv_cpu_mxl(env); + bool leaf =3D mpte_is_leaf(mpte); + + if (mxl =3D=3D MXL_RV32) { + /* leaf32.rsv1 =3D bits[6:2], nonleaf32.rsv1 =3D bits[9:2] */ + return leaf ? extract32(mpte, 2, 5) : extract32(mpte, 2, 8); + } + if (leaf) { + /* leaf64.rsv1 =3D bits[9:2], leaf64.rsv2 =3D bits[62:58] */ + return (extract64(mpte, 2, 8) << 5) | extract64(mpte, 58, 5); + } + /* nonleaf64.rsv1 =3D bits[9:2], nonleaf64.rsv2 =3D bit[62] */ + return (extract64(mpte, 2, 8) << 1) | extract64(mpte, 62, 1); +} + +static uint64_t mpte_get_perms(CPURISCVState *env, uint64_t mpte) +{ + RISCVMXL mxl =3D riscv_cpu_mxl(env); + + /* leaf32.perms =3D bits[30:7], leaf64.perms =3D bits[57:10] */ + return (mxl =3D=3D MXL_RV32) ? extract32(mpte, 7, 24) : extract64(mpte= , 10, 48); +} + +static bool mpte_check_nlnapot(CPURISCVState *env, uint64_t mpte, bool *nl= napot) +{ + RISCVMXL mxl =3D riscv_cpu_mxl(env); + uint64_t n_bit, ppn; + + if (mxl =3D=3D MXL_RV32) { + *nlnapot =3D false; + return true; + } + /* nonleaf64.n =3D bit[63], nonleaf64.ppn =3D bits[61:10] */ + n_bit =3D extract64(mpte, 63, 1); + ppn =3D extract64(mpte, 10, 52); + *nlnapot =3D n_bit; + return n_bit ? (ppn & 0x1ff) =3D=3D 0x100 : true; +} + +static uint64_t mpte_get_ppn(CPURISCVState *env, uint64_t mpte, int pn, + bool nlnapot) +{ + RISCVMXL mxl =3D riscv_cpu_mxl(env); + /* nonleaf64.ppn =3D bits[61:10], nonleaf32.ppn =3D bits[31:10] */ + uint64_t ppn =3D (mxl =3D=3D MXL_RV32) ? extract32(mpte, 10, 22) + : extract64(mpte, 10, 52); + + if (nlnapot) { + return deposit64(ppn, 0, 9, pn & 0x1ff); + } + return ppn; +} + +/* Caller should assert i before call this interface */ +static int mpt_get_pn(hwaddr addr, int i, mpt_mode_t mode) +{ + if (mode =3D=3D SMMPT34) { + return i =3D=3D 0 + ? extract64(addr, 15, 10) + : extract64(addr, 25, 9); + } else { + int offset =3D 16 + i * 9; + if ((mode =3D=3D SMMPT64) && (i =3D=3D 4)) { + return extract64(addr, offset, 12); + } else { + return extract64(addr, offset, 9); + } + } +} + +/* Caller should assert i before call this interface */ +static int mpt_get_pi(hwaddr addr, int i, mpt_mode_t mode) +{ + if (mode =3D=3D SMMPT34) { + return i =3D=3D 0 + ? extract64(addr, 12, 3) + : extract64(addr, 22, 3); + } else { + int offset =3D 16 + i * 9; + return extract64(addr, offset - 4, 4); + } +} + +static bool smmpt_lookup(CPURISCVState *env, hwaddr addr, mpt_mode_t mode, + int *prot, MMUAccessType access_type) +{ + MemTxResult res; + MemTxAttrs attrs =3D MEMTXATTRS_UNSPECIFIED; + CPUState *cs =3D env_cpu(env); + hwaddr mpte_addr, base =3D (hwaddr)env->mptppn << PGSHIFT; + load_entry_fn *load_entry; + uint32_t mptesize, levels, xwr; + int pn, pi, pmp_prot, pmp_ret; + uint64_t mpte, perms; + + switch (mode) { + case SMMPT34: + load_entry =3D &load_entry_32; levels =3D 2; mptesize =3D 4; break; + case SMMPT43: + load_entry =3D &load_entry_64; levels =3D 3; mptesize =3D 8; break; + break; + case SMMPT52: + load_entry =3D &load_entry_64; levels =3D 4; mptesize =3D 8; break; + case SMMPT64: + load_entry =3D &load_entry_64; levels =3D 5; mptesize =3D 8; break; + case SMMPTBARE: + *prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; + return true; + default: + g_assert_not_reached(); + break; + } + for (int i =3D levels - 1; i >=3D 0 ; i--) { + /* 1. Get pn[i] as the mpt index */ + pn =3D mpt_get_pn(addr, i, mode); + /* 2. Get mpte address and get mpte */ + mpte_addr =3D base + pn * mptesize; + pmp_ret =3D get_physical_address_pmp(env, &pmp_prot, mpte_addr, + mptesize, MMU_DATA_LOAD, PRV_M); + if (pmp_ret !=3D TRANSLATE_SUCCESS) { + return false; + } + mpte =3D load_entry(cs->as, mpte_addr, attrs, &res); + /* 3. Check valid bit and reserve bits of mpte */ + if (!mpte_is_valid(mpte) || mpte_get_rsv(env, mpte)) { + return false; + } + + /* 4. Process non-leaf node */ + if (!mpte_is_leaf(mpte)) { + bool nlnapot =3D false; + if (i =3D=3D 0) { + return false; + } + if (!mpte_check_nlnapot(env, mpte, &nlnapot)) { + return false; + } + base =3D mpte_get_ppn(env, mpte, pn, nlnapot) << PGSHIFT; + continue; + } + + /* 5. Process leaf node */ + pi =3D mpt_get_pi(addr, i, mode); + perms =3D mpte_get_perms(env, mpte); + xwr =3D (perms >> (pi * 3)) & 0x7; + switch (xwr) { + case PAGE_READ: + *prot =3D PAGE_READ; + return access_type =3D=3D MMU_DATA_LOAD; + case PAGE_EXEC: + *prot =3D PAGE_EXEC; + return access_type =3D=3D MMU_INST_FETCH; + case PAGE_READ | PAGE_EXEC: + *prot =3D PAGE_READ | PAGE_EXEC; + return (access_type =3D=3D MMU_DATA_LOAD || + access_type =3D=3D MMU_INST_FETCH); + case PAGE_READ | PAGE_WRITE: + *prot =3D PAGE_READ | PAGE_WRITE; + return (access_type =3D=3D MMU_DATA_LOAD || + access_type =3D=3D MMU_DATA_STORE); + case PAGE_READ | PAGE_WRITE | PAGE_EXEC: + *prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; + return true; + default: + return false; + } + } + return false; +} + +bool smmpt_check_access(CPURISCVState *env, hwaddr addr, + int *prot, MMUAccessType access_type) +{ + mpt_mode_t mode =3D env->mptmode; + + return smmpt_lookup(env, addr, mode, prot, access_type); +} diff --git a/target/riscv/riscv_smmpt.h b/target/riscv/riscv_smmpt.h index 74dcccf4be..c15637036e 100644 --- a/target/riscv/riscv_smmpt.h +++ b/target/riscv/riscv_smmpt.h @@ -9,6 +9,9 @@ #ifndef RISCV_SMMPT_H #define RISCV_SMMPT_H =20 +#include "cpu.h" +#include "exec/mmu-access-type.h" + typedef enum { SMMPTBARE =3D 0, SMMPT34 =3D 1, @@ -18,4 +21,6 @@ typedef enum { SMMPTMAX } mpt_mode_t; =20 +bool smmpt_check_access(CPURISCVState *env, hwaddr addr, + int *prot, MMUAccessType access_type); #endif --=20 2.43.0 From nobody Sat May 30 17:44:41 2026 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=none dis=none) header.from=linux.alibaba.com ARC-Seal: i=1; a=rsa-sha256; t=1778507012; cv=none; d=zohomail.com; s=zohoarc; b=m37K+LmpOVxIzio62lmCWExXF9vmI5BjAbSINirqtTrB4SNeC22qrzk4FLilVuQK3uYIfBMDFXnypvc2gAcUkT+nMpe0/GnMyKyiz/PTiOxkp5JuiEBX0fYIjeZgH6gmeblCUAskNd1CgBwFcDlbBoAZrNHcFDCXPPT10JmfE1I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778507012; 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=euUCDByZvkqsxPkd0TkxfvMAbIKiTTHDtS8ncpuqmrc=; b=Yh+2BmDbDwHPfC+rQ5YVbb7R65FUYJ/t5o0dOI4mdvDuPqdosiDqsuYwjgA/yfixgXPoZOypk7tDHLUmadHygMObmejQflDW3gNf70NJs6kJ8uMxLLwH0fmQcyiJgmEC8NfZItJu6yW72OMgTxm8Qd1uBIiMC6ZDoIvg0sxsrOA= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778507012490885.9214360588206; Mon, 11 May 2026 06:43:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMQ4T-0000U1-Me; Mon, 11 May 2026 08:49:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ4E-0000PD-Nc; Mon, 11 May 2026 08:49:04 -0400 Received: from out30-133.freemail.mail.aliyun.com ([115.124.30.133]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ4B-0001gi-E7; Mon, 11 May 2026 08:49:02 -0400 Received: from localhost.localdomain(mailfrom:zhiwei_liu@linux.alibaba.com fp:SMTPD_---0X2jPzjy_1778503731 cluster:ay36) by smtp.aliyun-inc.com; Mon, 11 May 2026 20:48:52 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1778503733; h=From:To:Subject:Date:Message-Id:MIME-Version; bh=euUCDByZvkqsxPkd0TkxfvMAbIKiTTHDtS8ncpuqmrc=; b=yPfLzk8tJLt6oAc2qjoFaEHyd2YEbYiVFrTQXsqfRhFrnFeb8qSuyoMqpf8Mw8z3ee6VGpNpq/G23S+EtklmKowob94XMq3Ss1ZGpP/bEmO8SfBBa5Z8oReoHfUULPDnG/vnumC0HaX9p42HWzJCaUVZ5giJE88L0VL73hSVa14= X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R531e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=maildocker-contentspam033045133197; MF=zhiwei_liu@linux.alibaba.com; NM=1; PH=DS; RN=11; SR=0; TI=SMTPD_---0X2jPzjy_1778503731; From: LIU Zhiwei To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, palmer@dabbelt.com, alistair.francis@wdc.com, daniel.barboza@oss.qualcomm.com, chao.liu.zevorn@gmail.com, liwei1518@gmail.com, LIU Zhiwei , Huang Tao , TANG Tiancheng , Daniel Henrique Barboza Subject: [PATCH v6 3/6] target/riscv: Integrate SMMPT checks into MMU and TLB fill Date: Mon, 11 May 2026 20:47:02 +0800 Message-Id: <20260511124705.28161-4-zhiwei_liu@linux.alibaba.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.com> References: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.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=lists1p.gnu.org; Received-SPF: pass client-ip=115.124.30.133; envelope-from=zhiwei_liu@linux.alibaba.com; helo=out30-133.freemail.mail.aliyun.com X-Spam_score_int: -174 X-Spam_score: -17.5 X-Spam_bar: ----------------- X-Spam_report: (-17.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 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 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 @linux.alibaba.com) X-ZM-MESSAGEID: 1778507014787158500 Content-Type: text/plain; charset="utf-8" With the core MPT lookup logic in place, this patch integrates the permission checks into QEMU's main MMU processing functions. A new helper, `get_physical_address_mpt`, is introduced to check the permissions for a given physical address against the MPT. This helper is then called at two critical points: 1. During page table walks (`get_physical_address`): The physical address of the Page Table Entry (PTE) itself is checked to ensure the supervisor has permission to read it. 2. After successful address translation (`riscv_cpu_tlb_fill`): The final guest-physical address is checked against the MPT before the access is allowed to proceed. This ensures that SMMPT protection is enforced for both the translation process and the final memory access, as required by the specification. Co-authored-by: Huang Tao Co-authored-by: TANG Tiancheng Signed-off-by: LIU Zhiwei Reviewed-by: Daniel Henrique Barboza Reviewed-by: Chao Liu Reviewed-by: Nutty Liu --- target/riscv/cpu_helper.c | 112 +++++++++++++++++++++++++++++++++----- 1 file changed, 99 insertions(+), 13 deletions(-) diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c index d0f0e77dfe..f0126bf534 100644 --- a/target/riscv/cpu_helper.c +++ b/target/riscv/cpu_helper.c @@ -1211,6 +1211,53 @@ static bool check_svukte_addr(CPURISCVState *env, va= ddr addr) return !high_bit; } =20 +/* + * get_physical_address_mpt - check mpt permission for this physical addre= ss + * + * Lookup the Memory Protection Table and check permission for this + * physical address. Returns 0 if the permission checking was successful + * + * @env: CPURISCVState + * @prot: The returned protection attributes + * @addr: The physical address to be checked permission + * @access_type: The type of MMU access + * @mode: Indicates current privilege level. + */ +static int get_physical_address_mpt(CPURISCVState *env, int *prot, hwaddr = addr, + MMUAccessType access_type, int mode) +{ + /* + * If the extension is not supported or the mmpt.mode is Bare, + * there is no protection, return success. + */ + if (!riscv_cpu_cfg(env)->ext_smmpt || env->mptmode =3D=3D SMMPTBARE) { + *prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; + return TRANSLATE_SUCCESS; + } + + /* + * MPT is checked for all accesses to physical memory, unless the + * effective privilege mode is M. + * + * Data accesses in M-mode when the MPRV bit in mstatus is set and + * the MPP field in mstatus contains S or U are subject to MPT checks. + * + * In riscv_env_mmu_index, The MPRV and MPP bits are already checked a= nd + * encoded to mmu_idx, So we do not need to check it here. + */ + if (mode =3D=3D PRV_M) { + *prot =3D PAGE_READ | PAGE_WRITE | PAGE_EXEC; + return TRANSLATE_SUCCESS; + } + + if (!smmpt_check_access(env, addr, prot, access_type)) { + *prot =3D 0; + return TRANSLATE_MPT_FAIL; + } + + return TRANSLATE_SUCCESS; +} + /* * get_physical_address - get the physical address for this virtual address * @@ -1408,6 +1455,13 @@ static int get_physical_address(CPURISCVState *env, = hwaddr *physical, pte_addr =3D base + idx * ptesize; } =20 + int mpt_prot; + int mpt_ret =3D get_physical_address_mpt(env, &mpt_prot, pte_addr, + MMU_DATA_LOAD, PRV_S); + if (mpt_ret !=3D TRANSLATE_SUCCESS) { + return mpt_ret; + } + int pmp_prot; int pmp_ret =3D get_physical_address_pmp(env, &pmp_prot, pte_addr, sxlen_bytes, @@ -1818,7 +1872,7 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, = int size, CPURISCVState *env =3D &cpu->env; vaddr im_address; hwaddr pa =3D 0; - int prot, prot2, prot_pmp; + int prot, prot2, prot_pmp, mpt_prot; bool pmp_violation =3D false; bool first_stage_error =3D true; bool two_stage_lookup =3D mmuidx_2stage(mmu_idx); @@ -1872,26 +1926,42 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address= , int size, prot &=3D prot2; =20 if (ret =3D=3D TRANSLATE_SUCCESS) { - ret =3D get_physical_address_pmp(env, &prot_pmp, pa, - size, access_type, mode); - tlb_size =3D pmp_get_tlb_size(env, pa); + ret =3D get_physical_address_mpt(env, &mpt_prot, pa, + access_type, mode); + if (riscv_cpu_cfg(env)->ext_smmpt) { + qemu_log_mask(CPU_LOG_MMU, + "%s MPT address=3D" HWADDR_FMT_plx " ret= %d" + " prot %d\n", + __func__, pa, ret, mpt_prot); + } + prot &=3D mpt_prot; =20 - qemu_log_mask(CPU_LOG_MMU, - "%s PMP address=3D" HWADDR_FMT_plx " ret %d = prot" - " %d tlb_size %" HWADDR_PRIu "\n", - __func__, pa, ret, prot_pmp, tlb_size); + if (ret =3D=3D TRANSLATE_SUCCESS) { + ret =3D get_physical_address_pmp(env, &prot_pmp, pa, + size, access_type, mode= ); + tlb_size =3D pmp_get_tlb_size(env, pa); + + qemu_log_mask(CPU_LOG_MMU, + "%s PMP address=3D" HWADDR_FMT_plx + " ret %d prot %d tlb_size %" + HWADDR_PRIu "\n", + __func__, pa, ret, prot_pmp, + tlb_size); =20 - prot &=3D prot_pmp; + prot &=3D prot_pmp; + } } else { /* * Guest physical address translation failed, this is a HS * level exception */ first_stage_error =3D false; - if (ret !=3D TRANSLATE_PMP_FAIL) { + if (ret !=3D TRANSLATE_PMP_FAIL && + ret !=3D TRANSLATE_MPT_FAIL) { env->guest_phys_fault_addr =3D (im_address | (address & - (TARGET_PAGE_SIZE - 1))= ) >> 2; + (TARGET_PAGE_SIZE - 1))) + >> 2; } } } @@ -1906,6 +1976,18 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address,= int size, HWADDR_FMT_plx " prot %d\n", __func__, address, ret, pa, prot); =20 + if (ret =3D=3D TRANSLATE_SUCCESS) { + ret =3D get_physical_address_mpt(env, &mpt_prot, pa, + access_type, mode); + if (riscv_cpu_cfg(env)->ext_smmpt) { + qemu_log_mask(CPU_LOG_MMU, + "%s MPT address=3D" HWADDR_FMT_plx " ret %d" + " prot %d\n", + __func__, pa, ret, mpt_prot); + } + prot &=3D mpt_prot; + } + if (ret =3D=3D TRANSLATE_SUCCESS) { ret =3D get_physical_address_pmp(env, &prot_pmp, pa, size, access_type, mode); @@ -1919,8 +2001,12 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address,= int size, prot &=3D prot_pmp; } } - - if (ret =3D=3D TRANSLATE_PMP_FAIL) { + /* + * Both MPT (Machine-level Memory Protection Table, Smmpt extension) a= nd + * PMP (Physical Memory Protection) follow the same exception reporting + * rule when an access violation is detected + */ + if (ret =3D=3D TRANSLATE_PMP_FAIL || ret =3D=3D TRANSLATE_MPT_FAIL) { pmp_violation =3D true; } =20 --=20 2.43.0 From nobody Sat May 30 17:44:41 2026 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=none dis=none) header.from=linux.alibaba.com ARC-Seal: i=1; a=rsa-sha256; t=1778506720; cv=none; d=zohomail.com; s=zohoarc; b=ncJWvhFXcvcqY1o/4ciWmXaHZtw773on58+/4dlZm+eRO/K93cCB5nVNyfaixK7AchvkZh++G695GL17369quZbWVyQMDfKaofY7LX1xJrlVCQbwBN4BPZztp9T5CJpdyPP9ve4IMYypOpBg6tmweHPNTgVl2KMoH4sMQ5mtVTM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778506720; 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=kBMAgW0uIObIlyJVbDzsUtQQf0Z+qZHm2zvfapEiHCs=; b=ZjcvFyWRULmLGnUxD3zpFQZcGJBc0geMQNS4F7w8JARWg+9MJZqxdGPKDrJGkTcKRcOeaGogp1+4stxsk87oqPRJj6XdRNon0kNLVNat9CaUE3/Ygrr7K2A30wP5jMFBSp/JYsruX4cLj3siJ5CqO2vVBohcTu34Rpy/Ftxci0Q= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778506719980874.2693013981749; Mon, 11 May 2026 06:38:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMQ55-0000rd-M7; Mon, 11 May 2026 08:49:59 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ4i-0000gj-Bu; Mon, 11 May 2026 08:49:34 -0400 Received: from out30-124.freemail.mail.aliyun.com ([115.124.30.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ4f-0002P2-6B; Mon, 11 May 2026 08:49:31 -0400 Received: from localhost.localdomain(mailfrom:zhiwei_liu@linux.alibaba.com fp:SMTPD_---0X2jPzrf_1778503762 cluster:ay36) by smtp.aliyun-inc.com; Mon, 11 May 2026 20:49:23 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1778503764; h=From:To:Subject:Date:Message-Id:MIME-Version; bh=kBMAgW0uIObIlyJVbDzsUtQQf0Z+qZHm2zvfapEiHCs=; b=Q6izBFyfByNdMdNcFvdo5qw/y0aPeSFQXsItvBuoxaTqH/K3HPDzpcvKCGqBQslVXCcxo/LRJmb63mwDQUlTYK8FLtbTtZgXNMqswX9gz6YbHYj7bzaUSq6GOFWvd8WZf6+elyS8ArY5cRS/NkoNAu1WxwjB6GqpaB/HCb0XM0M= X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R701e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=maildocker-contentspam033037033178; MF=zhiwei_liu@linux.alibaba.com; NM=1; PH=DS; RN=11; SR=0; TI=SMTPD_---0X2jPzrf_1778503762; From: LIU Zhiwei To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, palmer@dabbelt.com, alistair.francis@wdc.com, daniel.barboza@oss.qualcomm.com, chao.liu.zevorn@gmail.com, liwei1518@gmail.com, LIU Zhiwei , Huang Tao , TANG Tiancheng , Daniel Henrique Barboza Subject: [PATCH v6 4/6] target/riscv: Implement SMMPT fence instructions Date: Mon, 11 May 2026 20:47:03 +0800 Message-Id: <20260511124705.28161-5-zhiwei_liu@linux.alibaba.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.com> References: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.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=lists1p.gnu.org; Received-SPF: pass client-ip=115.124.30.124; envelope-from=zhiwei_liu@linux.alibaba.com; helo=out30-124.freemail.mail.aliyun.com X-Spam_score_int: -174 X-Spam_score: -17.5 X-Spam_bar: ----------------- X-Spam_report: (-17.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 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 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 @linux.alibaba.com) X-ZM-MESSAGEID: 1778506722906154100 Content-Type: text/plain; charset="utf-8" This patch completes the SMMPT implementation by adding support for the new fence instructions: `mfence.spa` and `minval.spa`. According to the specification, these instructions act as memory ordering fences for MPT updates. In QEMU's TCG model, this is conservatively implemented by flushing the entire TLB, which ensures that any subsequent memory accesses will re-evaluate permissions and see the effects of any pri= or MPT modifications. The instructions are privileged and will cause an illegal instruction exception if executed outside of M-mode. Co-authored-by: Huang Tao Co-authored-by: TANG Tiancheng Signed-off-by: LIU Zhiwei Reviewed-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis Reviewed-by: Chao Liu Reviewed-by: Nutty Liu --- target/riscv/insn32.decode | 2 ++ .../riscv/insn_trans/trans_privileged.c.inc | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index 6e35c4b1e6..84cec57daf 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -120,6 +120,8 @@ sret 0001000 00010 00000 000 00000 1110011 mret 0011000 00010 00000 000 00000 1110011 wfi 0001000 00101 00000 000 00000 1110011 sfence_vma 0001001 ..... ..... 000 00000 1110011 @sfence_vma +mfence_spa 1000011 ..... ..... 000 00000 1110011 @sfence_vma +minval_spa 0000011 ..... ..... 000 00000 1110011 @sfence_vma =20 # *** NMI *** mnret 0111000 00010 00000 000 00000 1110011 diff --git a/target/riscv/insn_trans/trans_privileged.c.inc b/target/riscv/= insn_trans/trans_privileged.c.inc index 8a62b4cfcd..5ec6bf5991 100644 --- a/target/riscv/insn_trans/trans_privileged.c.inc +++ b/target/riscv/insn_trans/trans_privileged.c.inc @@ -160,3 +160,33 @@ static bool trans_sfence_vma(DisasContext *ctx, arg_sf= ence_vma *a) #endif return false; } + +#define REQUIRE_SMSDID(ctx) do { \ + if (!ctx->cfg_ptr->ext_smsdid) { \ + return false; \ + } \ +} while (0) + +static bool do_mfence_spa(DisasContext *ctx) +{ +#ifndef CONFIG_USER_ONLY + REQUIRE_SMSDID(ctx); + if (ctx->priv !=3D PRV_M) { + return false; + } + decode_save_opc(ctx, 0); + gen_helper_tlb_flush_all(tcg_env); + return true; +#endif + return false; +} + +static bool trans_mfence_spa(DisasContext *ctx, arg_mfence_spa *a) +{ + return do_mfence_spa(ctx); +} + +static bool trans_minval_spa(DisasContext *ctx, arg_minval_spa *a) +{ + return do_mfence_spa(ctx); +} --=20 2.43.0 From nobody Sat May 30 17:44:41 2026 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=none dis=none) header.from=linux.alibaba.com ARC-Seal: i=1; a=rsa-sha256; t=1778505383; cv=none; d=zohomail.com; s=zohoarc; b=Rf4YtvcEA3fZn+R+GNznPoeHYdDTEQCYn3U7yRMO7MJlCdpbstY01LeQ0KyuzMzkxdR0wDUFLeqpDMVoW1f5cCCS/KTDW+msJesFOpypRPNPT60bxcQlbgfJnUyvb9D13hcFvjGBI3vcRK+LKkl+dGEZOBnj5F9/ZXkomjObkMU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778505383; 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=uz0v8IH206/WP4U6kxJEgjWtrOc9zeSZ1Tr3Vudc/ws=; b=UBFnRtluWJ1kkiVPucRAhWb7uxTGkKMXfLgLyqQBZIW+9tvKC938o5nUh/Tgf64UCU90DpgK3NVDOtT9KUZ0hKx4mcOP4OyoRxMHnifcukLYzJI7faTw0FK+AT1Td5FWm6qURnZtX8nKPXaHmaLPJT2HCfzD5xcTLtIIEKHtKuk= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778505383092224.47638770659523; Mon, 11 May 2026 06:16:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMQ5P-00018S-Pj; Mon, 11 May 2026 08:50:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ5C-0000zU-3h; Mon, 11 May 2026 08:50:04 -0400 Received: from out30-111.freemail.mail.aliyun.com ([115.124.30.111]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ59-00035g-MT; Mon, 11 May 2026 08:50:01 -0400 Received: from localhost.localdomain(mailfrom:zhiwei_liu@linux.alibaba.com fp:SMTPD_---0X2k9r5F_1778503793 cluster:ay36) by smtp.aliyun-inc.com; Mon, 11 May 2026 20:49:54 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1778503795; h=From:To:Subject:Date:Message-Id:MIME-Version; bh=uz0v8IH206/WP4U6kxJEgjWtrOc9zeSZ1Tr3Vudc/ws=; b=NNvYEtkiqHXTr617xDbKuAWn1gZ5x28GWx812Vw6F/kEqXTbNUav/7F2KPB8zHmBJo526+BWKkPcSl6zQAXudEWni4oNspyyJhFy/nYBYXtfPQGQutzjWSBPsjPhxmAHWxlWyOWaKRvRfd8L7dAQGNKrbR4BO2YHKn3nTnKPxo8= X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R161e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=maildocker-contentspam033037026112; MF=zhiwei_liu@linux.alibaba.com; NM=1; PH=DS; RN=10; SR=0; TI=SMTPD_---0X2k9r5F_1778503793; From: LIU Zhiwei To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, palmer@dabbelt.com, alistair.francis@wdc.com, daniel.barboza@oss.qualcomm.com, chao.liu.zevorn@gmail.com, liwei1518@gmail.com, LIU Zhiwei , Daniel Henrique Barboza , Frank Chang Subject: [PATCH v6 5/6] target/riscv: Fix smrnmi isa alphabetical order Date: Mon, 11 May 2026 20:47:04 +0800 Message-Id: <20260511124705.28161-6-zhiwei_liu@linux.alibaba.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.com> References: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.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=lists1p.gnu.org; Received-SPF: pass client-ip=115.124.30.111; envelope-from=zhiwei_liu@linux.alibaba.com; helo=out30-111.freemail.mail.aliyun.com X-Spam_score_int: -174 X-Spam_score: -17.5 X-Spam_bar: ----------------- X-Spam_report: (-17.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 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 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 @linux.alibaba.com) X-ZM-MESSAGEID: 1778505386480154100 Content-Type: text/plain; charset="utf-8" Signed-off-by: LIU Zhiwei Suggested-by: Daniel Henrique Barboza Reviewed-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis Reviewed-by: Frank Chang Reviewed-by: Chao Liu Reviewed-by: Nutty Liu --- target/riscv/cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index a13727c0d4..dd54c2fa1e 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -225,9 +225,9 @@ const RISCVIsaExtData isa_edata_arr[] =3D { ISA_EXT_DATA_ENTRY(smdbltrp, PRIV_VERSION_1_13_0, ext_smdbltrp), ISA_EXT_DATA_ENTRY(smepmp, PRIV_VERSION_1_12_0, ext_smepmp), ISA_EXT_DATA_ENTRY(smpmpmt, PRIV_VERSION_1_12_0, ext_smpmpmt), - ISA_EXT_DATA_ENTRY(smrnmi, PRIV_VERSION_1_12_0, ext_smrnmi), ISA_EXT_DATA_ENTRY(smmpm, PRIV_VERSION_1_13_0, ext_smmpm), ISA_EXT_DATA_ENTRY(smnpm, PRIV_VERSION_1_13_0, ext_smnpm), + ISA_EXT_DATA_ENTRY(smrnmi, PRIV_VERSION_1_12_0, ext_smrnmi), ISA_EXT_DATA_ENTRY(smstateen, PRIV_VERSION_1_12_0, ext_smstateen), ISA_EXT_DATA_ENTRY(ssaia, PRIV_VERSION_1_12_0, ext_ssaia), ISA_EXT_DATA_ENTRY(ssccfg, PRIV_VERSION_1_13_0, ext_ssccfg), --=20 2.43.0 From nobody Sat May 30 17:44:41 2026 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=none dis=none) header.from=linux.alibaba.com ARC-Seal: i=1; a=rsa-sha256; t=1778504274; cv=none; d=zohomail.com; s=zohoarc; b=SevuXtejHjn+MT8xcdhuxSSA1FZrcfRsbzy677kbnj8vTTSXXXMkfeE7OlBarNt5vHA4DuX2NuZVS2KC0DQ/+pseTkeg5TSxVaJCoqRKIvVZLPnoodGq3J4X5eowo6cyn2UmkhbFmw5IBRhIxL/Lx3Wssl80VlZQcQN057duhA0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778504274; 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=Y+rINOfoKesR57A2n21k2uM4ucaXGGG/1lqfmJGOr3c=; b=WtOM8JIXvgM5RoHhwIQjsW+bxcBSJ/7/59wKvJyADBUosC5gpUZlTD60aawdmtQ77DO2yXDDFNXDWuWLhcz3kn7U5ceOAgo/g813EKpVi9ti+9LPIGipZQif5w1GX27tylsX8KxG7FYGX+/mliKlHdhgwVqlTodGwR7cIKyGaHU= 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=none dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1778504274955506.1877542691733; Mon, 11 May 2026 05:57:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wMQ5o-000298-RN; Mon, 11 May 2026 08:50:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ5j-00022y-2n; Mon, 11 May 2026 08:50:35 -0400 Received: from out30-119.freemail.mail.aliyun.com ([115.124.30.119]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wMQ5g-0003aF-3e; Mon, 11 May 2026 08:50:34 -0400 Received: from localhost.localdomain(mailfrom:zhiwei_liu@linux.alibaba.com fp:SMTPD_---0X2k9rDv_1778503824 cluster:ay36) by smtp.aliyun-inc.com; Mon, 11 May 2026 20:50:25 +0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.alibaba.com; s=default; t=1778503826; h=From:To:Subject:Date:Message-Id:MIME-Version; bh=Y+rINOfoKesR57A2n21k2uM4ucaXGGG/1lqfmJGOr3c=; b=fU4ylHuWyMSvOBoojuJTECsLY+GT+tf69jd9iuZ0sa2SV3qC+hb41x5l66ysQniGNbdEXhfZpd7RTpthhoOHwixcYR7k85nDZ+hpU0hAwkENSMVdnSO2STRq97SyIye5lAPAqBz1Tc493+CGeRUvTzkXvvUPaHosVduVy5i/KlY= X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R201e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=maildocker-contentspam033045133197; MF=zhiwei_liu@linux.alibaba.com; NM=1; PH=DS; RN=12; SR=0; TI=SMTPD_---0X2k9rDv_1778503824; From: LIU Zhiwei To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, palmer@dabbelt.com, alistair.francis@wdc.com, daniel.barboza@oss.qualcomm.com, chao.liu.zevorn@gmail.com, liwei1518@gmail.com, LIU Zhiwei , Huang Tao , TANG Tiancheng , Daniel Henrique Barboza , Frank Chang Subject: [PATCH v6 6/6] target/riscv: Enable SMMPT extension Date: Mon, 11 May 2026 20:47:05 +0800 Message-Id: <20260511124705.28161-7-zhiwei_liu@linux.alibaba.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.com> References: <20260511124705.28161-1-zhiwei_liu@linux.alibaba.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=lists1p.gnu.org; Received-SPF: pass client-ip=115.124.30.119; envelope-from=zhiwei_liu@linux.alibaba.com; helo=out30-119.freemail.mail.aliyun.com X-Spam_score_int: -174 X-Spam_score: -17.5 X-Spam_bar: ----------------- X-Spam_report: (-17.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 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 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 @linux.alibaba.com) X-ZM-MESSAGEID: 1778504278088158500 Content-Type: text/plain; charset="utf-8" This patch implements v0.3.4 SMMPT specification(https://github.com/riscv/riscv-smmtt/releases/tag/v0.3.4). Co-authored-by: Huang Tao Co-authored-by: TANG Tiancheng Signed-off-by: LIU Zhiwei Reviewed-by: Daniel Henrique Barboza Reviewed-by: Chao Liu Reviewed-by: Frank Chang Reviewed-by: Nutty Liu --- target/riscv/cpu.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index dd54c2fa1e..31e59cd081 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -226,8 +226,10 @@ const RISCVIsaExtData isa_edata_arr[] =3D { ISA_EXT_DATA_ENTRY(smepmp, PRIV_VERSION_1_12_0, ext_smepmp), ISA_EXT_DATA_ENTRY(smpmpmt, PRIV_VERSION_1_12_0, ext_smpmpmt), ISA_EXT_DATA_ENTRY(smmpm, PRIV_VERSION_1_13_0, ext_smmpm), + ISA_EXT_DATA_ENTRY(smmpt, PRIV_VERSION_1_13_0, ext_smmpt), ISA_EXT_DATA_ENTRY(smnpm, PRIV_VERSION_1_13_0, ext_smnpm), ISA_EXT_DATA_ENTRY(smrnmi, PRIV_VERSION_1_12_0, ext_smrnmi), + ISA_EXT_DATA_ENTRY(smsdid, PRIV_VERSION_1_13_0, ext_smsdid), ISA_EXT_DATA_ENTRY(smstateen, PRIV_VERSION_1_12_0, ext_smstateen), ISA_EXT_DATA_ENTRY(ssaia, PRIV_VERSION_1_12_0, ext_ssaia), ISA_EXT_DATA_ENTRY(ssccfg, PRIV_VERSION_1_13_0, ext_ssccfg), @@ -1383,6 +1385,8 @@ const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[] = =3D { =20 /* These are experimental so mark with 'x-' */ const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] =3D { + MULTI_EXT_CFG_BOOL("x-smmpt", ext_smmpt, false), + MULTI_EXT_CFG_BOOL("x-smsdid", ext_smsdid, false), MULTI_EXT_CFG_BOOL("x-svukte", ext_svukte, false), =20 { }, @@ -2633,6 +2637,15 @@ static RISCVCPUImpliedExtsRule ZVFBFA_IMPLIED =3D { }, }; =20 +static RISCVCPUImpliedExtsRule SMMPT_IMPLIED =3D { + .ext =3D CPU_CFG_OFFSET(ext_smmpt), + .implied_multi_exts =3D { + CPU_CFG_OFFSET(ext_smsdid), + + RISCV_IMPLIED_EXTS_RULE_END + }, +}; + RISCVCPUImpliedExtsRule *riscv_misa_ext_implied_rules[] =3D { &RVA_IMPLIED, &RVD_IMPLIED, &RVF_IMPLIED, &RVM_IMPLIED, &RVV_IMPLIED, NULL @@ -2652,7 +2665,7 @@ RISCVCPUImpliedExtsRule *riscv_multi_ext_implied_rule= s[] =3D { &ZVKNC_IMPLIED, &ZVKNG_IMPLIED, &ZVKNHB_IMPLIED, &ZVKS_IMPLIED, &ZVKSC_IMPLIED, &ZVKSG_IMPLIED, &SSCFG_IMPLIED, &SUPM_IMPLIED, &SSPM_IMPLIED, &SMCTR_IMPLIED, &SSCTR_IMPLIED, - NULL + &SMMPT_IMPLIED, NULL }; =20 static const Property riscv_cpu_properties[] =3D { --=20 2.43.0