{"id":1882131,"url":"http://patchwork.ozlabs.org/api/patches/1882131/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20240103173349.398526-25-alex.bennee@linaro.org/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","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":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20240103173349.398526-25-alex.bennee@linaro.org>","list_archive_url":null,"date":"2024-01-03T17:33:30","name":"[v2,24/43] target/riscv: Move misa_mxl_max to class","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"481b029f6eb17a1120671472a6b896e74bfb383e","submitter":{"id":39532,"url":"http://patchwork.ozlabs.org/api/people/39532/?format=json","name":"Alex Bennée","email":"alex.bennee@linaro.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20240103173349.398526-25-alex.bennee@linaro.org/mbox/","series":[{"id":388742,"url":"http://patchwork.ozlabs.org/api/series/388742/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=388742","date":"2024-01-03T17:33:08","name":"testing and plugin updates for 9.0 (pre-PR)","version":2,"mbox":"http://patchwork.ozlabs.org/series/388742/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/1882131/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/1882131/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256\n header.s=google header.b=P+h5jLcd;\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 (lists.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 4T4xvn70ZSz1yQ5\n\tfor <incoming@patchwork.ozlabs.org>; Thu,  4 Jan 2024 04:45:41 +1100 (AEDT)","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 1rL5DQ-0007hV-H6; Wed, 03 Jan 2024 12:39:40 -0500","from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <alex.bennee@linaro.org>)\n id 1rL5DE-0006cA-LV\n for qemu-devel@nongnu.org; Wed, 03 Jan 2024 12:39:28 -0500","from mail-wr1-x42d.google.com ([2a00:1450:4864:20::42d])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <alex.bennee@linaro.org>)\n id 1rL5Cz-0000hM-QC\n for qemu-devel@nongnu.org; Wed, 03 Jan 2024 12:39:26 -0500","by mail-wr1-x42d.google.com with SMTP id\n ffacd0b85a97d-3373a30af67so3029830f8f.0\n for <qemu-devel@nongnu.org>; Wed, 03 Jan 2024 09:39:12 -0800 (PST)","from draig.lan ([85.9.250.243]) by smtp.gmail.com with ESMTPSA id\n u12-20020a5d434c000000b00336ee9edbb3sm18617127wrr.94.2024.01.03.09.39.06\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 03 Jan 2024 09:39:08 -0800 (PST)","from draig.lan (localhost [IPv6:::1])\n by draig.lan (Postfix) with ESMTP id 8A9695F933;\n Wed,  3 Jan 2024 17:33:51 +0000 (GMT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=linaro.org; s=google; t=1704303552; x=1704908352; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=0ZlBlDseJiU+Vt7ccbZJnZPKE9F5SWGJIPha2vy8A+4=;\n b=P+h5jLcdUkIlD+0e/WR4T13uM4DFP5M1SCZh73M/ByTyzKYUCNchuGn6RAidSYTfmS\n DzJohsJpZlD68IThyHiavGlHSeMMnyVDQGU4XTqTNsGokMhYfJpqlskbT0aGd46b0QMW\n EyY4o85e1N8JFKe7ryyR5y6jYQ2hwlMLM4IlcUI0iKnsjBSgIV5/5K+buPwPM2du4TLD\n YySLMvpZm4oku7wh1PJVZ7+AR1343wYGAZDIa0I+jJm/jYExQ87XNscvO6ew2TrpIQqO\n v+LXRz0Ds1JMc2EoE0DkL6R3GxbW5g+7xp7J/2fg1Nc5lA7qKwERYxQaZyLZ90KSbx2J\n 0XFQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1704303552; x=1704908352;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=0ZlBlDseJiU+Vt7ccbZJnZPKE9F5SWGJIPha2vy8A+4=;\n b=ivgYtOmYQnKyaEc8K7iN8FYofHIij4O95USBPjkhOHoCm4q7V6w6HXU+IOwqqAP11Z\n D6maNJwznWHGDRjVV1mQvA2cppXVCg8CRMaDMm6bILrw2FajCeNDRDbO+szuV1GK+vqu\n 0iQKjcjvcWBKkNvH8sO2IWAxy2Hq0anRbdD76OW81dp6ZUl5crfG3crOEsM/kDOO6nAb\n FFv6yOkhQOzUnWMOaw9b81ZYwmBvNzBeiF+KoaOimjqRabtmMlCZ2LyrGYkiXIHsPFg2\n NlAR/K6+rdi6ui1aAxPfjyk9G4s/+9b15+3CdVqH5S1t3RFNRtZ2dwXewpXz5l+jiEm2\n hTDQ==","X-Gm-Message-State":"AOJu0Yx0JgXfAfcKl5ibaucgb1v8EapALZFnXdVP+1qS7yyU1HgcOER2\n uSlDbTypSOoHuY0sMpV7U3xHOGL5IOhasg==","X-Google-Smtp-Source":"\n AGHT+IFqr3Z4thZuI0xn8+9eK/eeGC/kB87e6Vtt6MGql8yyKASzMmGIsEoA0Gcfeu0QzE8ibzpbfw==","X-Received":"by 2002:adf:e849:0:b0:336:8178:c269 with SMTP id\n d9-20020adfe849000000b003368178c269mr5842837wrn.89.1704303551846;\n Wed, 03 Jan 2024 09:39:11 -0800 (PST)","From":"=?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>","To":"qemu-devel@nongnu.org","Cc":"qemu-s390x@nongnu.org, qemu-ppc@nongnu.org,\n Richard Henderson <richard.henderson@linaro.org>,\n Song Gao <gaosong@loongson.cn>,\n =?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n David Hildenbrand <david@redhat.com>, Aurelien Jarno <aurelien@aurel32.net>,\n Yoshinori Sato <ysato@users.sourceforge.jp>,\n Yanan Wang <wangyanan55@huawei.com>, Bin Meng <bin.meng@windriver.com>,\n Laurent Vivier <lvivier@redhat.com>, Michael Rolnik <mrolnik@gmail.com>,\n Alexandre Iooss <erdnaxe@crans.org>, David Woodhouse <dwmw2@infradead.org>,\n Laurent Vivier <laurent@vivier.eu>, Paolo Bonzini <pbonzini@redhat.com>,\n Brian Cain <bcain@quicinc.com>,\n Daniel Henrique Barboza <danielhb413@gmail.com>,\n Beraldo Leal <bleal@redhat.com>, Paul Durrant <paul@xen.org>,\n Mahmoud Mandour <ma.mandourr@gmail.com>, Thomas Huth <thuth@redhat.com>,\n Liu Zhiwei <zhiwei_liu@linux.alibaba.com>, Cleber Rosa <crosa@redhat.com>,\n kvm@vger.kernel.org, Peter Maydell <peter.maydell@linaro.org>,\n Wainer dos Santos Moschetta <wainersm@redhat.com>, =?utf-8?q?Alex_Benn?=\n\t=?utf-8?q?=C3=A9e?= <alex.bennee@linaro.org>, qemu-arm@nongnu.org,\n Weiwei Li <liwei1518@gmail.com>,\n =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n John Snow <jsnow@redhat.com>,\n Daniel Henrique Barboza <dbarboza@ventanamicro.com>,\n Nicholas Piggin <npiggin@gmail.com>, Palmer Dabbelt <palmer@dabbelt.com>,\n Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,\n Ilya Leoshkevich <iii@linux.ibm.com>,\n =?utf-8?q?C=C3=A9dric_Le_Goater?= <clg@kaod.org>,\n \"Edgar E. Iglesias\" <edgar.iglesias@gmail.com>,\n Eduardo Habkost <eduardo@habkost.net>,\n Pierrick Bouvier <pierrick.bouvier@linaro.org>, qemu-riscv@nongnu.org,\n Alistair Francis <alistair.francis@wdc.com>,\n Akihiko Odaki <akihiko.odaki@daynix.com>","Subject":"[PATCH v2 24/43] target/riscv: Move misa_mxl_max to class","Date":"Wed,  3 Jan 2024 17:33:30 +0000","Message-Id":"<20240103173349.398526-25-alex.bennee@linaro.org>","X-Mailer":"git-send-email 2.39.2","In-Reply-To":"<20240103173349.398526-1-alex.bennee@linaro.org>","References":"<20240103173349.398526-1-alex.bennee@linaro.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2a00:1450:4864:20::42d;\n envelope-from=alex.bennee@linaro.org; helo=mail-wr1-x42d.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, SPF_PASS=-0.001,\n T_SCC_BODY_TEXT_LINE=-0.01 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-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":"From: Akihiko Odaki <akihiko.odaki@daynix.com>\n\nmisa_mxl_max is common for all instances of a RISC-V CPU class so they\nare better put into class.\n\nSigned-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>\nMessage-Id: <20231213-riscv-v7-3-a760156a337f@daynix.com>\nSigned-off-by: Alex Bennée <alex.bennee@linaro.org>\n---\n target/riscv/cpu.h         |   4 +-\n target/riscv/cpu.c         | 118 +++++++++++++++++++------------------\n target/riscv/gdbstub.c     |  12 ++--\n target/riscv/kvm/kvm-cpu.c |  10 ++--\n target/riscv/machine.c     |   7 +--\n target/riscv/tcg/tcg-cpu.c |  12 ++--\n target/riscv/translate.c   |   3 +-\n 7 files changed, 87 insertions(+), 79 deletions(-)","diff":"diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h\nindex d74b361be64..060b7f69a74 100644\n--- a/target/riscv/cpu.h\n+++ b/target/riscv/cpu.h\n@@ -169,7 +169,6 @@ struct CPUArchState {\n \n     /* RISCVMXL, but uint32_t for vmstate migration */\n     uint32_t misa_mxl;      /* current mxl */\n-    uint32_t misa_mxl_max;  /* max mxl for this cpu */\n     uint32_t misa_ext;      /* current extensions */\n     uint32_t misa_ext_mask; /* max ext for this cpu */\n     uint32_t xl;            /* current xlen */\n@@ -450,6 +449,7 @@ struct RISCVCPUClass {\n \n     DeviceRealize parent_realize;\n     ResettablePhases parent_phases;\n+    uint32_t misa_mxl_max;  /* max mxl for this cpu */\n };\n \n static inline int riscv_has_ext(CPURISCVState *env, target_ulong ext)\n@@ -756,7 +756,7 @@ enum riscv_pmu_event_idx {\n /* used by tcg/tcg-cpu.c*/\n void isa_ext_update_enabled(RISCVCPU *cpu, uint32_t ext_offset, bool en);\n bool isa_ext_is_enabled(RISCVCPU *cpu, uint32_t ext_offset);\n-void riscv_cpu_set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext);\n+void riscv_cpu_set_misa_ext(CPURISCVState *env, uint32_t ext);\n \n typedef struct RISCVCPUMultiExtConfig {\n     const char *name;\ndiff --git a/target/riscv/cpu.c b/target/riscv/cpu.c\nindex 83c7c0cf07b..2ab61df2217 100644\n--- a/target/riscv/cpu.c\n+++ b/target/riscv/cpu.c\n@@ -274,9 +274,8 @@ const char *riscv_cpu_get_trap_name(target_ulong cause, bool async)\n     }\n }\n \n-void riscv_cpu_set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext)\n+void riscv_cpu_set_misa_ext(CPURISCVState *env, uint32_t ext)\n {\n-    env->misa_mxl_max = env->misa_mxl = mxl;\n     env->misa_ext_mask = env->misa_ext = ext;\n }\n \n@@ -378,11 +377,7 @@ static void riscv_any_cpu_init(Object *obj)\n {\n     RISCVCPU *cpu = RISCV_CPU(obj);\n     CPURISCVState *env = &cpu->env;\n-#if defined(TARGET_RISCV32)\n-    riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVU);\n-#elif defined(TARGET_RISCV64)\n-    riscv_cpu_set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU);\n-#endif\n+    riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVU);\n \n #ifndef CONFIG_USER_ONLY\n     set_satp_mode_max_supported(RISCV_CPU(obj),\n@@ -403,16 +398,14 @@ static void riscv_max_cpu_init(Object *obj)\n {\n     RISCVCPU *cpu = RISCV_CPU(obj);\n     CPURISCVState *env = &cpu->env;\n-    RISCVMXL mlx = MXL_RV64;\n \n-#ifdef TARGET_RISCV32\n-    mlx = MXL_RV32;\n-#endif\n-    riscv_cpu_set_misa(env, mlx, 0);\n     env->priv_ver = PRIV_VERSION_LATEST;\n #ifndef CONFIG_USER_ONLY\n-    set_satp_mode_max_supported(RISCV_CPU(obj), mlx == MXL_RV32 ?\n-                                VM_1_10_SV32 : VM_1_10_SV57);\n+#ifdef TARGET_RISCV32\n+    set_satp_mode_max_supported(cpu, VM_1_10_SV32);\n+#else\n+    set_satp_mode_max_supported(cpu, VM_1_10_SV57);\n+#endif\n #endif\n }\n \n@@ -420,8 +413,6 @@ static void riscv_max_cpu_init(Object *obj)\n static void rv64_base_cpu_init(Object *obj)\n {\n     CPURISCVState *env = &RISCV_CPU(obj)->env;\n-    /* We set this in the realise function */\n-    riscv_cpu_set_misa(env, MXL_RV64, 0);\n     /* Set latest version of privileged specification */\n     env->priv_ver = PRIV_VERSION_LATEST;\n #ifndef CONFIG_USER_ONLY\n@@ -433,8 +424,7 @@ static void rv64_sifive_u_cpu_init(Object *obj)\n {\n     RISCVCPU *cpu = RISCV_CPU(obj);\n     CPURISCVState *env = &cpu->env;\n-    riscv_cpu_set_misa(env, MXL_RV64,\n-                       RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);\n+    riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);\n     env->priv_ver = PRIV_VERSION_1_10_0;\n #ifndef CONFIG_USER_ONLY\n     set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV39);\n@@ -452,7 +442,7 @@ static void rv64_sifive_e_cpu_init(Object *obj)\n     CPURISCVState *env = &RISCV_CPU(obj)->env;\n     RISCVCPU *cpu = RISCV_CPU(obj);\n \n-    riscv_cpu_set_misa(env, MXL_RV64, RVI | RVM | RVA | RVC | RVU);\n+    riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVC | RVU);\n     env->priv_ver = PRIV_VERSION_1_10_0;\n #ifndef CONFIG_USER_ONLY\n     set_satp_mode_max_supported(cpu, VM_1_10_MBARE);\n@@ -469,7 +459,7 @@ static void rv64_thead_c906_cpu_init(Object *obj)\n     CPURISCVState *env = &RISCV_CPU(obj)->env;\n     RISCVCPU *cpu = RISCV_CPU(obj);\n \n-    riscv_cpu_set_misa(env, MXL_RV64, RVG | RVC | RVS | RVU);\n+    riscv_cpu_set_misa_ext(env, RVG | RVC | RVS | RVU);\n     env->priv_ver = PRIV_VERSION_1_11_0;\n \n     cpu->cfg.ext_zfa = true;\n@@ -500,7 +490,7 @@ static void rv64_veyron_v1_cpu_init(Object *obj)\n     CPURISCVState *env = &RISCV_CPU(obj)->env;\n     RISCVCPU *cpu = RISCV_CPU(obj);\n \n-    riscv_cpu_set_misa(env, MXL_RV64, RVG | RVC | RVS | RVU | RVH);\n+    riscv_cpu_set_misa_ext(env, RVG | RVC | RVS | RVU | RVH);\n     env->priv_ver = PRIV_VERSION_1_12_0;\n \n     /* Enable ISA extensions */\n@@ -544,8 +534,6 @@ static void rv128_base_cpu_init(Object *obj)\n         exit(EXIT_FAILURE);\n     }\n     CPURISCVState *env = &RISCV_CPU(obj)->env;\n-    /* We set this in the realise function */\n-    riscv_cpu_set_misa(env, MXL_RV128, 0);\n     /* Set latest version of privileged specification */\n     env->priv_ver = PRIV_VERSION_LATEST;\n #ifndef CONFIG_USER_ONLY\n@@ -556,8 +544,6 @@ static void rv128_base_cpu_init(Object *obj)\n static void rv32_base_cpu_init(Object *obj)\n {\n     CPURISCVState *env = &RISCV_CPU(obj)->env;\n-    /* We set this in the realise function */\n-    riscv_cpu_set_misa(env, MXL_RV32, 0);\n     /* Set latest version of privileged specification */\n     env->priv_ver = PRIV_VERSION_LATEST;\n #ifndef CONFIG_USER_ONLY\n@@ -569,8 +555,7 @@ static void rv32_sifive_u_cpu_init(Object *obj)\n {\n     RISCVCPU *cpu = RISCV_CPU(obj);\n     CPURISCVState *env = &cpu->env;\n-    riscv_cpu_set_misa(env, MXL_RV32,\n-                       RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);\n+    riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);\n     env->priv_ver = PRIV_VERSION_1_10_0;\n #ifndef CONFIG_USER_ONLY\n     set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32);\n@@ -588,7 +573,7 @@ static void rv32_sifive_e_cpu_init(Object *obj)\n     CPURISCVState *env = &RISCV_CPU(obj)->env;\n     RISCVCPU *cpu = RISCV_CPU(obj);\n \n-    riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVC | RVU);\n+    riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVC | RVU);\n     env->priv_ver = PRIV_VERSION_1_10_0;\n #ifndef CONFIG_USER_ONLY\n     set_satp_mode_max_supported(cpu, VM_1_10_MBARE);\n@@ -605,7 +590,7 @@ static void rv32_ibex_cpu_init(Object *obj)\n     CPURISCVState *env = &RISCV_CPU(obj)->env;\n     RISCVCPU *cpu = RISCV_CPU(obj);\n \n-    riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVC | RVU);\n+    riscv_cpu_set_misa_ext(env, RVI | RVM | RVC | RVU);\n     env->priv_ver = PRIV_VERSION_1_12_0;\n #ifndef CONFIG_USER_ONLY\n     set_satp_mode_max_supported(cpu, VM_1_10_MBARE);\n@@ -622,7 +607,7 @@ static void rv32_imafcu_nommu_cpu_init(Object *obj)\n     CPURISCVState *env = &RISCV_CPU(obj)->env;\n     RISCVCPU *cpu = RISCV_CPU(obj);\n \n-    riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVC | RVU);\n+    riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVC | RVU);\n     env->priv_ver = PRIV_VERSION_1_10_0;\n #ifndef CONFIG_USER_ONLY\n     set_satp_mode_max_supported(cpu, VM_1_10_MBARE);\n@@ -845,7 +830,7 @@ static void riscv_cpu_reset_hold(Object *obj)\n         mcc->parent_phases.hold(obj);\n     }\n #ifndef CONFIG_USER_ONLY\n-    env->misa_mxl = env->misa_mxl_max;\n+    env->misa_mxl = mcc->misa_mxl_max;\n     env->priv = PRV_M;\n     env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);\n     if (env->misa_mxl > MXL_RV32) {\n@@ -1213,6 +1198,12 @@ static void riscv_cpu_post_init(Object *obj)\n \n static void riscv_cpu_init(Object *obj)\n {\n+    RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(obj);\n+    RISCVCPU *cpu = RISCV_CPU(obj);\n+    CPURISCVState *env = &cpu->env;\n+\n+    env->misa_mxl = mcc->misa_mxl_max;\n+\n #ifndef CONFIG_USER_ONLY\n     qdev_init_gpio_in(DEVICE(obj), riscv_cpu_set_irq,\n                       IRQ_LOCAL_MAX + IRQ_LOCAL_GUEST_MAX);\n@@ -1657,7 +1648,7 @@ static void cpu_get_marchid(Object *obj, Visitor *v, const char *name,\n     visit_type_bool(v, name, &value, errp);\n }\n \n-static void riscv_cpu_class_init(ObjectClass *c, void *data)\n+static void riscv_cpu_common_class_init(ObjectClass *c, void *data)\n {\n     RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);\n     CPUClass *cc = CPU_CLASS(c);\n@@ -1699,6 +1690,13 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)\n     device_class_set_props(dc, riscv_cpu_properties);\n }\n \n+static void riscv_cpu_class_init(ObjectClass *c, void *data)\n+{\n+    RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);\n+\n+    mcc->misa_mxl_max = (uint32_t)(uintptr_t)data;\n+}\n+\n static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str,\n                                  int max_str_len)\n {\n@@ -1764,18 +1762,22 @@ void riscv_cpu_list(void)\n     g_slist_free(list);\n }\n \n-#define DEFINE_CPU(type_name, initfn)      \\\n-    {                                      \\\n-        .name = type_name,                 \\\n-        .parent = TYPE_RISCV_CPU,          \\\n-        .instance_init = initfn            \\\n+#define DEFINE_CPU(type_name, misa_mxl_max, initfn)         \\\n+    {                                                       \\\n+        .name = (type_name),                                \\\n+        .parent = TYPE_RISCV_CPU,                           \\\n+        .instance_init = (initfn),                          \\\n+        .class_init = riscv_cpu_class_init,                 \\\n+        .class_data = (void *)(misa_mxl_max)                \\\n     }\n \n-#define DEFINE_DYNAMIC_CPU(type_name, initfn) \\\n-    {                                         \\\n-        .name = type_name,                    \\\n-        .parent = TYPE_RISCV_DYNAMIC_CPU,     \\\n-        .instance_init = initfn               \\\n+#define DEFINE_DYNAMIC_CPU(type_name, misa_mxl_max, initfn) \\\n+    {                                                       \\\n+        .name = (type_name),                                \\\n+        .parent = TYPE_RISCV_DYNAMIC_CPU,                   \\\n+        .instance_init = (initfn),                          \\\n+        .class_init = riscv_cpu_class_init,                 \\\n+        .class_data = (void *)(misa_mxl_max)                \\\n     }\n \n static const TypeInfo riscv_cpu_type_infos[] = {\n@@ -1788,29 +1790,31 @@ static const TypeInfo riscv_cpu_type_infos[] = {\n         .instance_post_init = riscv_cpu_post_init,\n         .abstract = true,\n         .class_size = sizeof(RISCVCPUClass),\n-        .class_init = riscv_cpu_class_init,\n+        .class_init = riscv_cpu_common_class_init,\n     },\n     {\n         .name = TYPE_RISCV_DYNAMIC_CPU,\n         .parent = TYPE_RISCV_CPU,\n         .abstract = true,\n     },\n-    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY,      riscv_any_cpu_init),\n-    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX,      riscv_max_cpu_init),\n #if defined(TARGET_RISCV32)\n-    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32,   rv32_base_cpu_init),\n-    DEFINE_CPU(TYPE_RISCV_CPU_IBEX,             rv32_ibex_cpu_init),\n-    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31,       rv32_sifive_e_cpu_init),\n-    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34,       rv32_imafcu_nommu_cpu_init),\n-    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34,       rv32_sifive_u_cpu_init),\n+    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY,     MXL_RV32,  riscv_any_cpu_init),\n+    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX,     MXL_RV32,  riscv_max_cpu_init),\n+    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32,  MXL_RV32,  rv32_base_cpu_init),\n+    DEFINE_CPU(TYPE_RISCV_CPU_IBEX,            MXL_RV32,  rv32_ibex_cpu_init),\n+    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31,      MXL_RV32,  rv32_sifive_e_cpu_init),\n+    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34,      MXL_RV32,  rv32_imafcu_nommu_cpu_init),\n+    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34,      MXL_RV32,  rv32_sifive_u_cpu_init),\n #elif defined(TARGET_RISCV64)\n-    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64,   rv64_base_cpu_init),\n-    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51,       rv64_sifive_e_cpu_init),\n-    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54,       rv64_sifive_u_cpu_init),\n-    DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C,         rv64_sifive_u_cpu_init),\n-    DEFINE_CPU(TYPE_RISCV_CPU_THEAD_C906,       rv64_thead_c906_cpu_init),\n-    DEFINE_CPU(TYPE_RISCV_CPU_VEYRON_V1,        rv64_veyron_v1_cpu_init),\n-    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128,  rv128_base_cpu_init),\n+    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY,     MXL_RV64,  riscv_any_cpu_init),\n+    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX,     MXL_RV64,  riscv_max_cpu_init),\n+    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64,  MXL_RV64,  rv64_base_cpu_init),\n+    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51,      MXL_RV64,  rv64_sifive_e_cpu_init),\n+    DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54,      MXL_RV64,  rv64_sifive_u_cpu_init),\n+    DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C,        MXL_RV64,  rv64_sifive_u_cpu_init),\n+    DEFINE_CPU(TYPE_RISCV_CPU_THEAD_C906,      MXL_RV64,  rv64_thead_c906_cpu_init),\n+    DEFINE_CPU(TYPE_RISCV_CPU_VEYRON_V1,       MXL_RV64,  rv64_veyron_v1_cpu_init),\n+    DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, MXL_RV128, rv128_base_cpu_init),\n #endif\n };\n \ndiff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c\nindex 58b3ace0fe9..365040228a1 100644\n--- a/target/riscv/gdbstub.c\n+++ b/target/riscv/gdbstub.c\n@@ -49,6 +49,7 @@ static const struct TypeSize vec_lanes[] = {\n \n int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)\n {\n+    RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);\n     RISCVCPU *cpu = RISCV_CPU(cs);\n     CPURISCVState *env = &cpu->env;\n     target_ulong tmp;\n@@ -61,7 +62,7 @@ int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)\n         return 0;\n     }\n \n-    switch (env->misa_mxl_max) {\n+    switch (mcc->misa_mxl_max) {\n     case MXL_RV32:\n         return gdb_get_reg32(mem_buf, tmp);\n     case MXL_RV64:\n@@ -75,12 +76,13 @@ int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)\n \n int riscv_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)\n {\n+    RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);\n     RISCVCPU *cpu = RISCV_CPU(cs);\n     CPURISCVState *env = &cpu->env;\n     int length = 0;\n     target_ulong tmp;\n \n-    switch (env->misa_mxl_max) {\n+    switch (mcc->misa_mxl_max) {\n     case MXL_RV32:\n         tmp = (int32_t)ldl_p(mem_buf);\n         length = 4;\n@@ -214,11 +216,12 @@ static int riscv_gdb_set_virtual(CPURISCVState *cs, uint8_t *mem_buf, int n)\n \n static int riscv_gen_dynamic_csr_xml(CPUState *cs, int base_reg)\n {\n+    RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);\n     RISCVCPU *cpu = RISCV_CPU(cs);\n     CPURISCVState *env = &cpu->env;\n     GString *s = g_string_new(NULL);\n     riscv_csr_predicate_fn predicate;\n-    int bitsize = 16 << env->misa_mxl_max;\n+    int bitsize = 16 << mcc->misa_mxl_max;\n     int i;\n \n #if !defined(CONFIG_USER_ONLY)\n@@ -310,6 +313,7 @@ static int ricsv_gen_dynamic_vector_xml(CPUState *cs, int base_reg)\n \n void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)\n {\n+    RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);\n     RISCVCPU *cpu = RISCV_CPU(cs);\n     CPURISCVState *env = &cpu->env;\n     if (env->misa_ext & RVD) {\n@@ -326,7 +330,7 @@ void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)\n                                  ricsv_gen_dynamic_vector_xml(cs, base_reg),\n                                  \"riscv-vector.xml\", 0);\n     }\n-    switch (env->misa_mxl_max) {\n+    switch (mcc->misa_mxl_max) {\n     case MXL_RV32:\n         gdb_register_coprocessor(cs, riscv_gdb_get_virtual,\n                                  riscv_gdb_set_virtual,\ndiff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c\nindex 117e33cf90f..ed86f21b8f2 100644\n--- a/target/riscv/kvm/kvm-cpu.c\n+++ b/target/riscv/kvm/kvm-cpu.c\n@@ -1499,14 +1499,14 @@ static void kvm_cpu_accel_register_types(void)\n }\n type_init(kvm_cpu_accel_register_types);\n \n-static void riscv_host_cpu_init(Object *obj)\n+static void riscv_host_cpu_class_init(ObjectClass *c, void *data)\n {\n-    CPURISCVState *env = &RISCV_CPU(obj)->env;\n+    RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);\n \n #if defined(TARGET_RISCV32)\n-    env->misa_mxl_max = env->misa_mxl = MXL_RV32;\n+    mcc->misa_mxl_max = MXL_RV32;\n #elif defined(TARGET_RISCV64)\n-    env->misa_mxl_max = env->misa_mxl = MXL_RV64;\n+    mcc->misa_mxl_max = MXL_RV64;\n #endif\n }\n \n@@ -1514,7 +1514,7 @@ static const TypeInfo riscv_kvm_cpu_type_infos[] = {\n     {\n         .name = TYPE_RISCV_CPU_HOST,\n         .parent = TYPE_RISCV_CPU,\n-        .instance_init = riscv_host_cpu_init,\n+        .class_init = riscv_host_cpu_class_init,\n     }\n };\n \ndiff --git a/target/riscv/machine.c b/target/riscv/machine.c\nindex fdde243e040..4c8d9a66595 100644\n--- a/target/riscv/machine.c\n+++ b/target/riscv/machine.c\n@@ -178,10 +178,9 @@ static const VMStateDescription vmstate_pointermasking = {\n \n static bool rv128_needed(void *opaque)\n {\n-    RISCVCPU *cpu = opaque;\n-    CPURISCVState *env = &cpu->env;\n+    RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(opaque);\n \n-    return env->misa_mxl_max == MXL_RV128;\n+    return mcc->misa_mxl_max == MXL_RV128;\n }\n \n static const VMStateDescription vmstate_rv128 = {\n@@ -372,7 +371,7 @@ const VMStateDescription vmstate_riscv_cpu = {\n         VMSTATE_UINTTL(env.vext_ver, RISCVCPU),\n         VMSTATE_UINT32(env.misa_mxl, RISCVCPU),\n         VMSTATE_UINT32(env.misa_ext, RISCVCPU),\n-        VMSTATE_UINT32(env.misa_mxl_max, RISCVCPU),\n+        VMSTATE_UNUSED(4),\n         VMSTATE_UINT32(env.misa_ext_mask, RISCVCPU),\n         VMSTATE_UINTTL(env.priv, RISCVCPU),\n         VMSTATE_BOOL(env.virt_enabled, RISCVCPU),\ndiff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c\nindex ee17f65afb6..7f6712c81a4 100644\n--- a/target/riscv/tcg/tcg-cpu.c\n+++ b/target/riscv/tcg/tcg-cpu.c\n@@ -152,10 +152,9 @@ static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu)\n {\n     RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);\n     CPUClass *cc = CPU_CLASS(mcc);\n-    CPURISCVState *env = &cpu->env;\n \n     /* Validate that MISA_MXL is set properly. */\n-    switch (env->misa_mxl_max) {\n+    switch (mcc->misa_mxl_max) {\n #ifdef TARGET_RISCV64\n     case MXL_RV64:\n     case MXL_RV128:\n@@ -274,6 +273,7 @@ static void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu)\n  */\n void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)\n {\n+    RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);\n     CPURISCVState *env = &cpu->env;\n     Error *local_err = NULL;\n \n@@ -454,7 +454,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)\n         cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcb), true);\n         cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcmp), true);\n         cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcmt), true);\n-        if (riscv_has_ext(env, RVF) && env->misa_mxl_max == MXL_RV32) {\n+        if (riscv_has_ext(env, RVF) && mcc->misa_mxl_max == MXL_RV32) {\n             cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcf), true);\n         }\n     }\n@@ -462,7 +462,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)\n     /* zca, zcd and zcf has a PRIV 1.12.0 restriction */\n     if (riscv_has_ext(env, RVC) && env->priv_ver >= PRIV_VERSION_1_12_0) {\n         cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zca), true);\n-        if (riscv_has_ext(env, RVF) && env->misa_mxl_max == MXL_RV32) {\n+        if (riscv_has_ext(env, RVF) && mcc->misa_mxl_max == MXL_RV32) {\n             cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcf), true);\n         }\n         if (riscv_has_ext(env, RVD)) {\n@@ -470,7 +470,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)\n         }\n     }\n \n-    if (env->misa_mxl_max != MXL_RV32 && cpu->cfg.ext_zcf) {\n+    if (mcc->misa_mxl_max != MXL_RV32 && cpu->cfg.ext_zcf) {\n         error_setg(errp, \"Zcf extension is only relevant to RV32\");\n         return;\n     }\n@@ -956,7 +956,7 @@ static void riscv_init_max_cpu_extensions(Object *obj)\n     const RISCVCPUMultiExtConfig *prop;\n \n     /* Enable RVG, RVJ and RVV that are disabled by default */\n-    riscv_cpu_set_misa(env, env->misa_mxl, env->misa_ext | RVG | RVJ | RVV);\n+    riscv_cpu_set_misa_ext(env, env->misa_ext | RVG | RVJ | RVV);\n \n     for (prop = riscv_cpu_extensions; prop && prop->name; prop++) {\n         isa_ext_update_enabled(cpu, prop->offset, true);\ndiff --git a/target/riscv/translate.c b/target/riscv/translate.c\nindex f0be79bb160..7e383c5eebf 100644\n--- a/target/riscv/translate.c\n+++ b/target/riscv/translate.c\n@@ -1167,6 +1167,7 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)\n {\n     DisasContext *ctx = container_of(dcbase, DisasContext, base);\n     CPURISCVState *env = cpu_env(cs);\n+    RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);\n     RISCVCPU *cpu = RISCV_CPU(cs);\n     uint32_t tb_flags = ctx->base.tb->flags;\n \n@@ -1188,7 +1189,7 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)\n     ctx->cfg_vta_all_1s = cpu->cfg.rvv_ta_all_1s;\n     ctx->vstart_eq_zero = FIELD_EX32(tb_flags, TB_FLAGS, VSTART_EQ_ZERO);\n     ctx->vl_eq_vlmax = FIELD_EX32(tb_flags, TB_FLAGS, VL_EQ_VLMAX);\n-    ctx->misa_mxl_max = env->misa_mxl_max;\n+    ctx->misa_mxl_max = mcc->misa_mxl_max;\n     ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL);\n     ctx->address_xl = FIELD_EX32(tb_flags, TB_FLAGS, AXL);\n     ctx->cs = cs;\n","prefixes":["v2","24/43"]}