Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.1/patches/2221197/?format=api
{ "id": 2221197, "url": "http://patchwork.ozlabs.org/api/1.1/patches/2221197/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260408140635.42546-2-zhiwei_liu@linux.alibaba.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/1.1/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20260408140635.42546-2-zhiwei_liu@linux.alibaba.com>", "date": "2026-04-08T14:06:30", "name": "[v5,1/6] target/riscv: Add basic definitions and CSRs for SMMPT", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "b7767903c51fe41d8d218b4a004eddc6cce50dd1", "submitter": { "id": 84720, "url": "http://patchwork.ozlabs.org/api/1.1/people/84720/?format=api", "name": "LIU Zhiwei", "email": "zhiwei_liu@linux.alibaba.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260408140635.42546-2-zhiwei_liu@linux.alibaba.com/mbox/", "series": [ { "id": 499183, "url": "http://patchwork.ozlabs.org/api/1.1/series/499183/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=499183", "date": "2026-04-08T14:06:34", "name": "target/riscv: Implement Smsdid and Smmpt extension", "version": 5, "mbox": "http://patchwork.ozlabs.org/series/499183/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2221197/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2221197/checks/", "tags": {}, "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 (1024-bit key;\n unprotected) header.d=linux.alibaba.com header.i=@linux.alibaba.com\n header.a=rsa-sha256 header.s=default header.b=xyLaGDKW;\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 4frYPf3YMMz1yD6\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 05:42:46 +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 1wAYWq-0000r1-0w; Wed, 08 Apr 2026 15:25:32 -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 <zhiwei_liu@linux.alibaba.com>)\n id 1wAY7E-0007b4-TO; Wed, 08 Apr 2026 14:59:05 -0400", "from out30-112.freemail.mail.aliyun.com ([115.124.30.112])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <zhiwei_liu@linux.alibaba.com>)\n id 1wATar-0001D5-NT; Wed, 08 Apr 2026 10:09:24 -0400", "from localhost.localdomain(mailfrom:zhiwei_liu@linux.alibaba.com\n fp:SMTPD_---0X0f7V58_1775657233 cluster:ay36) by smtp.aliyun-inc.com;\n Wed, 08 Apr 2026 22:07:14 +0800" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linux.alibaba.com; s=default;\n t=1775657234; h=From:To:Subject:Date:Message-Id:MIME-Version;\n bh=5lMRHKqs6Bxx8Dg3zBtwYkr7QPmxy73f8UkGge8FRzU=;\n b=xyLaGDKWq5MuJq6SH8hvUVYxawhOYB7LOMRpDeKfBGMBvOGdx04G5ccQlYExXdE2nHKPZWv2TstgemQFsvDR8C9myALiNvK1JCSZ6U/nBgI9tB5Q6rGFaYR8p5dlsUMoJ9lL2kXzQN2Pp31DmvOV4Q+2dt6npJ9lxVRiwroF024=", "X-Alimail-AntiSpam": "AC=PASS; BC=-1|-1; BR=01201311R471e4; CH=green;\n DM=||false|;\n DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=maildocker-contentspam033037026112;\n MF=zhiwei_liu@linux.alibaba.com; NM=1; PH=DS; RN=11; SR=0;\n TI=SMTPD_---0X0f7V58_1775657233;", "From": "LIU Zhiwei <zhiwei_liu@linux.alibaba.com>", "To": "qemu-devel@nongnu.org", "Cc": "qemu-riscv@nongnu.org, chao.liu.zevorn@gmail.com, palmer@dabbelt.com,\n alistair23@gmail.com, daniel.barboza@oss.qualcomm.com, liwei1518@gmail.com,\n LIU Zhiwei <zhiwei_liu@linux.alibaba.com>,\n Huang Tao <eric.huang@linux.alibaba.com>,\n TANG Tiancheng <lyndra@linux.alibaba.com>,\n Daniel Henrique Barboza <dbarboza@ventanamicro.com>", "Subject": "[PATCH v5 1/6] target/riscv: Add basic definitions and CSRs for SMMPT", "Date": "Wed, 8 Apr 2026 22:06:30 +0800", "Message-Id": "<20260408140635.42546-2-zhiwei_liu@linux.alibaba.com>", "X-Mailer": "git-send-email 2.39.3 (Apple Git-146)", "In-Reply-To": "<20260408140635.42546-1-zhiwei_liu@linux.alibaba.com>", "References": "<20260408140635.42546-1-zhiwei_liu@linux.alibaba.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Received-SPF": "pass client-ip=115.124.30.112;\n envelope-from=zhiwei_liu@linux.alibaba.com;\n helo=out30-112.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,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001,\n RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001,\n UNPARSEABLE_RELAY=0.001, USER_IN_DEF_DKIM_WL=-7.5,\n 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 <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" }, "content": "This patch lays the groundwork for the SMMPT (Supervisor Domains Access\nProtection) extension by introducing its fundamental components.\n\nIt adds:\n- New CPU configuration flags, `ext_smmpt` and `ext_smsdid`, to enable\n the extension.\n- Bit-field definitions for the `mmpt` CSR in `cpu_bits.h`.\n- The `mmpt` and `msdcfg` CSR numbers and their read/write handlers in\n `csr.c`.\n- New fields in `CPUArchState` to store the state of these new CSRs.\n- A new translation failure reason `TRANSLATE_MPT_FAIL`.\n\nThis provides the necessary infrastructure for the core MPT logic and\nMMU integration that will follow.\n\nCo-authored-by: Huang Tao <eric.huang@linux.alibaba.com>\nCo-authored-by: TANG Tiancheng <lyndra@linux.alibaba.com>\nSigned-off-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>\nReviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>\n---\n target/riscv/cpu.h | 9 ++-\n target/riscv/cpu_bits.h | 27 +++++++++\n target/riscv/cpu_cfg_fields.h.inc | 2 +\n target/riscv/csr.c | 95 +++++++++++++++++++++++++++++++\n target/riscv/riscv_smmpt.h | 21 +++++++\n 5 files changed, 153 insertions(+), 1 deletion(-)\n create mode 100644 target/riscv/riscv_smmpt.h", "diff": "diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h\nindex 35d1f6362c..f8265c2cc2 100644\n--- a/target/riscv/cpu.h\n+++ b/target/riscv/cpu.h\n@@ -130,7 +130,8 @@ enum {\n TRANSLATE_SUCCESS,\n TRANSLATE_FAIL,\n TRANSLATE_PMP_FAIL,\n- TRANSLATE_G_STAGE_FAIL\n+ TRANSLATE_G_STAGE_FAIL,\n+ TRANSLATE_MPT_FAIL\n };\n \n /* Extension context status */\n@@ -181,6 +182,7 @@ extern RISCVCPUImpliedExtsRule *riscv_multi_ext_implied_rules[];\n #if !defined(CONFIG_USER_ONLY)\n #include \"pmp.h\"\n #include \"debug.h\"\n+#include \"riscv_smmpt.h\"\n #endif\n \n #define RV_VLEN_MAX 1024\n@@ -481,6 +483,11 @@ struct CPUArchState {\n uint64_t hstateen[SMSTATEEN_MAX_COUNT];\n uint64_t sstateen[SMSTATEEN_MAX_COUNT];\n uint64_t henvcfg;\n+ /* Smsdid */\n+ uint32_t mptmode;\n+ uint32_t sdid;\n+ uint64_t mptppn;\n+ uint32_t msdcfg;\n #endif\n \n /* Fields from here on are preserved across CPU reset. */\ndiff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h\nindex b62dd82fe7..c6a34863d1 100644\n--- a/target/riscv/cpu_bits.h\n+++ b/target/riscv/cpu_bits.h\n@@ -1164,4 +1164,31 @@ typedef enum CTRType {\n #define MCONTEXT64 0x0000000000001FFFULL\n #define MCONTEXT32_HCONTEXT 0x0000007F\n #define MCONTEXT64_HCONTEXT 0x0000000000003FFFULL\n+\n+/* Smsdid */\n+#define CSR_MMPT 0xbc0\n+#define CSR_MSDCFG 0xbd1\n+\n+#define MMPT_MODE_MASK_32 0xC0000000\n+#define MMPT_SDID_MASK_32 0x3F000000\n+#define MMPT_PPN_MASK_32 0x003FFFFF\n+\n+#define MMPT_MODE_SHIFT_32 30\n+#define MMPT_SDID_SHIFT_32 24\n+\n+#define MMPT_MODE_MASK_64 0xF000000000000000ULL\n+#define MMPT_SDID_MASK_64 0x0FC0000000000000ULL\n+#define MMPT_PPN_MASK_64 0x000FFFFFFFFFFFFFULL\n+\n+#define MPTE_L3_VALID 0x0000100000000000ULL\n+#define MPTE_L3_RESERVED 0xFFFFE00000000000ULL\n+\n+#define MPTE_L2_RESERVED_64 0xFFFF800000000000ULL\n+#define MPTE_L2_RESERVED_32 0xFE000000\n+\n+#define MPTE_L1_RESERVED_64 0xFFFFFFFF00000000ULL\n+#define MPTE_L1_RESERVED_32 0xFFFF0000\n+\n+#define MMPT_MODE_SHIFT_64 60\n+#define MMPT_SDID_SHIFT_64 54\n #endif\ndiff --git a/target/riscv/cpu_cfg_fields.h.inc b/target/riscv/cpu_cfg_fields.h.inc\nindex cd1a5ec56b..80644948dd 100644\n--- a/target/riscv/cpu_cfg_fields.h.inc\n+++ b/target/riscv/cpu_cfg_fields.h.inc\n@@ -63,6 +63,8 @@ BOOL_FIELD(ext_smpmpmt)\n BOOL_FIELD(ext_svrsw60t59b)\n BOOL_FIELD(ext_svvptc)\n BOOL_FIELD(ext_svukte)\n+BOOL_FIELD(ext_smmpt)\n+BOOL_FIELD(ext_smsdid)\n BOOL_FIELD(ext_zdinx)\n BOOL_FIELD(ext_zaamo)\n BOOL_FIELD(ext_zacas)\ndiff --git a/target/riscv/csr.c b/target/riscv/csr.c\nindex a75281539b..081d2fc2c3 100644\n--- a/target/riscv/csr.c\n+++ b/target/riscv/csr.c\n@@ -793,6 +793,15 @@ static RISCVException rnmi(CPURISCVState *env, int csrno)\n \n return RISCV_EXCP_ILLEGAL_INST;\n }\n+\n+static RISCVException smsdid(CPURISCVState *env, int csrno)\n+{\n+ if (riscv_cpu_cfg(env)->ext_smsdid) {\n+ return RISCV_EXCP_NONE;\n+ }\n+\n+ return RISCV_EXCP_ILLEGAL_INST;\n+}\n #endif\n \n static RISCVException seed(CPURISCVState *env, int csrno)\n@@ -5446,6 +5455,89 @@ static RISCVException write_mnstatus(CPURISCVState *env, int csrno,\n return RISCV_EXCP_NONE;\n }\n \n+static RISCVException read_mmpt(CPURISCVState *env, int csrno,\n+ target_ulong *val)\n+{\n+ if (riscv_cpu_xlen(env) == 32) {\n+ uint32_t value = 0;\n+ value |= env->mptmode << MMPT_MODE_SHIFT_32;\n+ value |= (env->sdid << MMPT_SDID_SHIFT_32) & MMPT_SDID_MASK_32;\n+ value |= env->mptppn & MMPT_PPN_MASK_32;\n+ *val = value;\n+ } else if (riscv_cpu_xlen(env) == 64) {\n+ uint64_t value_64 = 0;\n+ uint32_t mode_value = env->mptmode;\n+ /* mpt_mode_t convert to mmpt.mode value */\n+ if (mode_value) {\n+ mode_value -= SMMPT43 - SMMPT34;\n+ }\n+ value_64 |= (uint64_t)mode_value << MMPT_MODE_SHIFT_64;\n+ value_64 |= ((uint64_t)env->sdid << MMPT_SDID_SHIFT_64)\n+ & MMPT_SDID_MASK_64;\n+ value_64 |= (uint64_t)env->mptppn & MMPT_PPN_MASK_64;\n+ *val = value_64;\n+ } else {\n+ return RISCV_EXCP_ILLEGAL_INST;\n+ }\n+ return RISCV_EXCP_NONE;\n+}\n+\n+static RISCVException write_mmpt(CPURISCVState *env, int csrno,\n+ target_ulong val, uintptr_t ra)\n+{\n+ uint32_t mode_value = 0;\n+ if (!riscv_cpu_cfg(env)->ext_smmpt) {\n+ goto set_remaining_fields_zero;\n+ }\n+\n+ if (riscv_cpu_xlen(env) == 32) {\n+ mode_value = (val & MMPT_MODE_MASK_32) >> MMPT_MODE_SHIFT_32;\n+ /* If mode is bare, the remaining fields in mmpt must be zero */\n+ if (mode_value == SMMPTBARE) {\n+ goto set_remaining_fields_zero;\n+ } else if (mode_value <= SMMPT34) {\n+ /* Only write the legal value */\n+ env->mptmode = mode_value;\n+ }\n+ env->sdid = (val & MMPT_SDID_MASK_32) >> MMPT_SDID_SHIFT_32;\n+ env->mptppn = val & MMPT_PPN_MASK_32;\n+ } else if (riscv_cpu_xlen(env) == 64) {\n+ mode_value = (val & MMPT_MODE_MASK_64) >> MMPT_MODE_SHIFT_64;\n+ if (mode_value == SMMPTBARE) {\n+ goto set_remaining_fields_zero;\n+ } else if (mode_value < SMMPTMAX) {\n+ /* convert to mpt_mode_t */\n+ mode_value += SMMPT43 - SMMPT34;\n+ env->mptmode = mode_value;\n+ }\n+ env->sdid = (val & MMPT_SDID_MASK_64) >> MMPT_SDID_SHIFT_64;\n+ env->mptppn = val & MMPT_PPN_MASK_64;\n+ } else {\n+ return RISCV_EXCP_ILLEGAL_INST;\n+ }\n+ return RISCV_EXCP_NONE;\n+\n+set_remaining_fields_zero:\n+ env->sdid = 0;\n+ env->mptmode = SMMPTBARE;\n+ env->mptppn = 0;\n+ return RISCV_EXCP_NONE;\n+}\n+\n+static RISCVException read_msdcfg(CPURISCVState *env, int csrno,\n+ target_ulong *val)\n+{\n+ *val = env->msdcfg;\n+ return RISCV_EXCP_NONE;\n+}\n+\n+static RISCVException write_msdcfg(CPURISCVState *env, int csrno,\n+ target_ulong val, uintptr_t ra)\n+{\n+ env->msdcfg = val;\n+ return RISCV_EXCP_NONE;\n+}\n+\n #endif\n \n /* Crypto Extension */\n@@ -6660,6 +6752,9 @@ riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {\n write_mhpmcounterh },\n [CSR_SCOUNTOVF] = { \"scountovf\", sscofpmf, read_scountovf,\n .min_priv_ver = PRIV_VERSION_1_12_0 },\n+ /* Supervisor Domain Identifier and Protection Registers */\n+ [CSR_MMPT] = { \"mmpt\", smsdid, read_mmpt, write_mmpt },\n+ [CSR_MSDCFG] = { \"msdcfg\", smsdid, read_msdcfg, write_msdcfg },\n \n #endif /* !CONFIG_USER_ONLY */\n };\ndiff --git a/target/riscv/riscv_smmpt.h b/target/riscv/riscv_smmpt.h\nnew file mode 100644\nindex 0000000000..74dcccf4be\n--- /dev/null\n+++ b/target/riscv/riscv_smmpt.h\n@@ -0,0 +1,21 @@\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+#ifndef RISCV_SMMPT_H\n+#define RISCV_SMMPT_H\n+\n+typedef enum {\n+ SMMPTBARE = 0,\n+ SMMPT34 = 1,\n+ SMMPT43 = 2,\n+ SMMPT52 = 3,\n+ SMMPT64 = 4,\n+ SMMPTMAX\n+} mpt_mode_t;\n+\n+#endif\n", "prefixes": [ "v5", "1/6" ] }