{"id":2175697,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2175697/?format=json","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.0/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":""},"msgid":"<20251218183122.408690-2-sergeev0xef@gmail.com>","date":"2025-12-18T18:31:16","name":"[RFC,1/6] target/riscv: Refactor counter index calculation.","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"fbf8e2eac842f2faedd5e4478634be45ce4fb3e7","submitter":{"id":92294,"url":"http://patchwork.ozlabs.org/api/1.0/people/92294/?format=json","name":"Aleksandr Sergeev","email":"sergeev0xef@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20251218183122.408690-2-sergeev0xef@gmail.com/mbox/","series":[{"id":485896,"url":"http://patchwork.ozlabs.org/api/1.0/series/485896/?format=json","date":"2025-12-18T18:31:20","name":"More extendable PMU subsystem.","version":1,"mbox":"http://patchwork.ozlabs.org/series/485896/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2175697/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 (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20230601 header.b=frfUp7Cz;\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 4dXK7635RTz1y2F\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 19 Dec 2025 05:33:38 +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 1vWIo3-0003wN-4T; Thu, 18 Dec 2025 13:32:55 -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 <sergeev0xef@gmail.com>)\n id 1vWImy-0003mR-JS\n for qemu-devel@nongnu.org; Thu, 18 Dec 2025 13:31:49 -0500","from mail-lf1-x132.google.com ([2a00:1450:4864:20::132])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <sergeev0xef@gmail.com>)\n id 1vWImw-0007LK-Dk\n for qemu-devel@nongnu.org; Thu, 18 Dec 2025 13:31:48 -0500","by mail-lf1-x132.google.com with SMTP id\n 2adb3069b0e04-598eaafa587so1036970e87.3\n for <qemu-devel@nongnu.org>; Thu, 18 Dec 2025 10:31:46 -0800 (PST)","from NB-8855.Dlink ([81.201.19.27]) by smtp.gmail.com with ESMTPSA\n id\n 2adb3069b0e04-59a185dd229sm46777e87.22.2025.12.18.10.31.42\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 18 Dec 2025 10:31:43 -0800 (PST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20230601; t=1766082704; x=1766687504; 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=qY9aDXCdvQKlOQpzxCCXLCIfXFIvBpXlP4Of3TlgDT0=;\n b=frfUp7CztBhrF7bUwQhPdmIX3Zwt/YHXcqjYoMTbmFbJSnHmS1n5jpDeuqsc056G2x\n GC1JKj99e05SCfdwti1aL5CFbVU6TbLnk3wkl299PQZKoTIXHGYkVqvByFQDM2pvx2uR\n eotf6k9u/J/JNCn6OYV+2X9xcbywdMHRy8iRCzkdD9FaBSuC8eAsjSmrMzIAuWwEsCbK\n Af2o2RyuOQ4smzNXwHfeneKyvRgTOIllE1eh85wzZRm2k5ANEa7koftiSGBoFGH73ijO\n b1BL4L3HDlVjLw/neRPktDmx+mawSWVys+R88pR98V0TiX+6tVU+6eH1n5EOhBG+YByd\n XqQA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1766082704; x=1766687504;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=qY9aDXCdvQKlOQpzxCCXLCIfXFIvBpXlP4Of3TlgDT0=;\n b=uhaxYmTsj9oeIQsrmOF5ATdkSLaQml3m6+3xCsePdgoBEhnXl8tJJIh3w0ZauKlBiJ\n QFTDhTwZxnKca3g061VtJFBLB975pme5IlzEOCey0WukFWd339I6XGwlCaDgvqRBYIIf\n kMuHKnCvSYGBLudocKuFoyGn4WvcsPd/6uZw/pd38jvANPlaw03r5oBNAgDeHor6LWvw\n S66oTwiAllJNwPt8ze5Ca1BN06DgsQEkCI3xcRuWtYpR7Z0ArLs14W3nT7hXZlm3LvsU\n PvpHSMf4yKWyxS+EuYHQdbYYq9tuamMAddr7/T0s8EPC3r+vz2Z107OhyWnRh0o7FiUA\n Bv6Q==","X-Gm-Message-State":"AOJu0Ywo/cRQ+4xnJ2abYSLffHjPdlFKhE61KBRS7tThM6Z1kjdlwjuk\n BKA+FU8dbZ/fXoG5W8KTiRck1O9zgcHR3goPmOyVjwyJABRFKLMqefJzCp6WzCkI","X-Gm-Gg":"AY/fxX4JoovVOafXQ79crc/1qiKl9hefV5pvbK6Et4pxoZHuJ1cpzBO1a7EdytZB50l\n j7wrMn19TPH8P3wwoaxQs3cEfJ5KlBZBY3KVixJFWQbVwJBh+M4qE2BC4Aa447DS9xJY+SU/1PG\n z2h0Asy8GAyBEatzd/fX6mCoQvTuJwKgAMDs7qeNLfN8k+Edy1kipxKCd5pqjfMw4+GQhMdTUa3\n 9CxHH3nSj6jJq3iMAnYcK/wonJckw6S+Ja+0spEYWrctcryXsL9bP5YBlhC6CDhw+aLIyXiTCdc\n vY9IQdVFBisW21YRXezUr3JM8uWmudMKv4lJUQjfo3fEV1MgHYml0km1t/9UClGxygW9AwLUm6O\n G2EJNeq1eV9khshlYPDQypy6K4t9dKspkH2NhXHHd88blzq2iI/J3VitnX1bSo7xS+g/YDrUhqT\n 1yAfwCgY6orOXIMcpQxS6oTGg=","X-Google-Smtp-Source":"\n AGHT+IHJ6lbcS8fFShto5gll/FXeeb1NoDPVa5BWh8z711aAmKy1tNvUoNTRCTAyCbvA2jpbTAp3fA==","X-Received":"by 2002:a05:6512:a96:b0:594:5f00:c0b7 with SMTP id\n 2adb3069b0e04-59a17d8cf43mr149974e87.15.1766082703963;\n Thu, 18 Dec 2025 10:31:43 -0800 (PST)","From":"Aleksandr Sergeev <sergeev0xef@gmail.com>","To":"qemu-devel@nongnu.org","Cc":"halip0503@gmail.com,\n\tAleksandr Sergeev <sergeev0xef@gmail.com>","Subject":"[RFC PATCH 1/6] target/riscv: Refactor counter index calculation.","Date":"Thu, 18 Dec 2025 21:31:16 +0300","Message-ID":"<20251218183122.408690-2-sergeev0xef@gmail.com>","X-Mailer":"git-send-email 2.51.0","In-Reply-To":"<20251218183122.408690-1-sergeev0xef@gmail.com>","References":"<20251218183122.408690-1-sergeev0xef@gmail.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=2a00:1450:4864:20::132;\n envelope-from=sergeev0xef@gmail.com; helo=mail-lf1-x132.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, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-Mailman-Approved-At":"Thu, 18 Dec 2025 13:32:34 -0500","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":"When working with hpm registers, we need to calculate counter index\nby csr number. By now it was done manually. Let's add a function --\nriscv_pmu_csrno_to_ctr_idx(), which incapsulates this action.\n\nSigned-off-by: Aleksandr Sergeev <sergeev0xef@gmail.com>\nReviewed-by: Alexei Filippov <halip0503@gmail.com>\n---\n target/riscv/cpu_bits.h |  4 +++\n target/riscv/csr.c      | 73 ++++++++++++++---------------------------\n target/riscv/pmu.c      | 44 +++++++++++++++++++++++++\n target/riscv/pmu.h      |  1 +\n 4 files changed, 73 insertions(+), 49 deletions(-)","diff":"diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h\nindex b62dd82fe7..5c3c1af64e 100644\n--- a/target/riscv/cpu_bits.h\n+++ b/target/riscv/cpu_bits.h\n@@ -1145,6 +1145,10 @@ typedef enum CTRType {\n /* RISC-V-specific interrupt pending bits. */\n #define CPU_INTERRUPT_RNMI                 CPU_INTERRUPT_TGT_EXT_0\n \n+#define HPM_MCYCLE_IDX                     0\n+#define HPM_MTIME_IDX                      1\n+#define HPM_MINSTRET_IDX                   2\n+\n /* JVT CSR bits */\n #define JVT_MODE                           0x3F\n #define JVT_BASE                           (~0x3F)\ndiff --git a/target/riscv/csr.c b/target/riscv/csr.c\nindex 5c91658c3d..8bdbc71160 100644\n--- a/target/riscv/csr.c\n+++ b/target/riscv/csr.c\n@@ -110,17 +110,8 @@ static RISCVException ctr(CPURISCVState *env, int csrno)\n {\n #if !defined(CONFIG_USER_ONLY)\n     RISCVCPU *cpu = env_archcpu(env);\n-    int ctr_index;\n-    target_ulong ctr_mask;\n-    int base_csrno = CSR_CYCLE;\n-    bool rv32 = riscv_cpu_mxl(env) == MXL_RV32 ? true : false;\n-\n-    if (rv32 && csrno >= CSR_CYCLEH) {\n-        /* Offset for RV32 hpmcounternh counters */\n-        base_csrno += 0x80;\n-    }\n-    ctr_index = csrno - base_csrno;\n-    ctr_mask = BIT(ctr_index);\n+    uint32_t ctr_index = riscv_pmu_csrno_to_ctr_idx(csrno);\n+    target_ulong ctr_mask = BIT(ctr_index);\n \n     if ((csrno >= CSR_CYCLE && csrno <= CSR_INSTRET) ||\n         (csrno >= CSR_CYCLEH && csrno <= CSR_INSTRETH)) {\n@@ -1166,9 +1157,9 @@ static RISCVException write_minstretcfgh(CPURISCVState *env, int csrno,\n static RISCVException read_mhpmevent(CPURISCVState *env, int csrno,\n                                      target_ulong *val)\n {\n-    int evt_index = csrno - CSR_MCOUNTINHIBIT;\n+    uint32_t ctr_idx = riscv_pmu_csrno_to_ctr_idx(csrno);\n \n-    *val = env->mhpmevent_val[evt_index];\n+    *val = env->mhpmevent_val[ctr_idx];\n \n     return RISCV_EXCP_NONE;\n }\n@@ -1176,14 +1167,15 @@ static RISCVException read_mhpmevent(CPURISCVState *env, int csrno,\n static RISCVException write_mhpmevent(CPURISCVState *env, int csrno,\n                                       target_ulong val, uintptr_t ra)\n {\n-    int evt_index = csrno - CSR_MCOUNTINHIBIT;\n+    uint32_t ctr_idx = riscv_pmu_csrno_to_ctr_idx(csrno);\n+\n     uint64_t mhpmevt_val = val;\n     uint64_t inh_avail_mask;\n \n     if (riscv_cpu_mxl(env) == MXL_RV32) {\n-        env->mhpmevent_val[evt_index] = val;\n+        env->mhpmevent_val[ctr_idx] = val;\n         mhpmevt_val = mhpmevt_val |\n-                      ((uint64_t)env->mhpmeventh_val[evt_index] << 32);\n+                      ((uint64_t)env->mhpmeventh_val[ctr_idx] << 32);\n     } else {\n         inh_avail_mask = ~MHPMEVENT_FILTER_MASK | MHPMEVENT_BIT_MINH;\n         inh_avail_mask |= riscv_has_ext(env, RVU) ? MHPMEVENT_BIT_UINH : 0;\n@@ -1193,10 +1185,10 @@ static RISCVException write_mhpmevent(CPURISCVState *env, int csrno,\n         inh_avail_mask |= (riscv_has_ext(env, RVH) &&\n                            riscv_has_ext(env, RVS)) ? MHPMEVENT_BIT_VSINH : 0;\n         mhpmevt_val = val & inh_avail_mask;\n-        env->mhpmevent_val[evt_index] = mhpmevt_val;\n+        env->mhpmevent_val[ctr_idx] = mhpmevt_val;\n     }\n \n-    riscv_pmu_update_event_map(env, mhpmevt_val, evt_index);\n+    riscv_pmu_update_event_map(env, mhpmevt_val, ctr_idx);\n \n     return RISCV_EXCP_NONE;\n }\n@@ -1204,9 +1196,9 @@ static RISCVException write_mhpmevent(CPURISCVState *env, int csrno,\n static RISCVException read_mhpmeventh(CPURISCVState *env, int csrno,\n                                       target_ulong *val)\n {\n-    int evt_index = csrno - CSR_MHPMEVENT3H + 3;\n+    uint32_t ctr_idx = riscv_pmu_csrno_to_ctr_idx(csrno);\n \n-    *val = env->mhpmeventh_val[evt_index];\n+    *val = env->mhpmeventh_val[ctr_idx];\n \n     return RISCV_EXCP_NONE;\n }\n@@ -1214,9 +1206,9 @@ static RISCVException read_mhpmeventh(CPURISCVState *env, int csrno,\n static RISCVException write_mhpmeventh(CPURISCVState *env, int csrno,\n                                        target_ulong val, uintptr_t ra)\n {\n-    int evt_index = csrno - CSR_MHPMEVENT3H + 3;\n+    uint32_t ctr_idx = riscv_pmu_csrno_to_ctr_idx(csrno);\n     uint64_t mhpmevth_val;\n-    uint64_t mhpmevt_val = env->mhpmevent_val[evt_index];\n+    uint64_t mhpmevt_val = env->mhpmevent_val[ctr_idx];\n     target_ulong inh_avail_mask = (target_ulong)(~MHPMEVENTH_FILTER_MASK |\n                                                   MHPMEVENTH_BIT_MINH);\n \n@@ -1229,9 +1221,9 @@ static RISCVException write_mhpmeventh(CPURISCVState *env, int csrno,\n \n     mhpmevth_val = val & inh_avail_mask;\n     mhpmevt_val = mhpmevt_val | (mhpmevth_val << 32);\n-    env->mhpmeventh_val[evt_index] = mhpmevth_val;\n+    env->mhpmeventh_val[ctr_idx] = mhpmevth_val;\n \n-    riscv_pmu_update_event_map(env, mhpmevt_val, evt_index);\n+    riscv_pmu_update_event_map(env, mhpmevt_val, ctr_idx);\n \n     return RISCV_EXCP_NONE;\n }\n@@ -1357,7 +1349,7 @@ static RISCVException riscv_pmu_write_ctrh(CPURISCVState *env, target_ulong val,\n static RISCVException write_mhpmcounter(CPURISCVState *env, int csrno,\n                                         target_ulong val, uintptr_t ra)\n {\n-    int ctr_idx = csrno - CSR_MCYCLE;\n+    uint32_t ctr_idx = riscv_pmu_csrno_to_ctr_idx(csrno);\n \n     return riscv_pmu_write_ctr(env, val, ctr_idx);\n }\n@@ -1365,7 +1357,7 @@ static RISCVException write_mhpmcounter(CPURISCVState *env, int csrno,\n static RISCVException write_mhpmcounterh(CPURISCVState *env, int csrno,\n                                          target_ulong val, uintptr_t ra)\n {\n-    int ctr_idx = csrno - CSR_MCYCLEH;\n+    uint32_t ctr_idx = riscv_pmu_csrno_to_ctr_idx(csrno);\n \n     return riscv_pmu_write_ctrh(env, val, ctr_idx);\n }\n@@ -1406,33 +1398,16 @@ RISCVException riscv_pmu_read_ctr(CPURISCVState *env, target_ulong *val,\n static RISCVException read_hpmcounter(CPURISCVState *env, int csrno,\n                                       target_ulong *val)\n {\n-    uint16_t ctr_index;\n-\n-    if (csrno >= CSR_MCYCLE && csrno <= CSR_MHPMCOUNTER31) {\n-        ctr_index = csrno - CSR_MCYCLE;\n-    } else if (csrno >= CSR_CYCLE && csrno <= CSR_HPMCOUNTER31) {\n-        ctr_index = csrno - CSR_CYCLE;\n-    } else {\n-        return RISCV_EXCP_ILLEGAL_INST;\n-    }\n-\n-    return riscv_pmu_read_ctr(env, val, false, ctr_index);\n+    uint32_t ctr_idx = riscv_pmu_csrno_to_ctr_idx(csrno);\n+    return riscv_pmu_read_ctr(env, val, false, ctr_idx);\n }\n \n static RISCVException read_hpmcounterh(CPURISCVState *env, int csrno,\n                                        target_ulong *val)\n {\n-    uint16_t ctr_index;\n \n-    if (csrno >= CSR_MCYCLEH && csrno <= CSR_MHPMCOUNTER31H) {\n-        ctr_index = csrno - CSR_MCYCLEH;\n-    } else if (csrno >= CSR_CYCLEH && csrno <= CSR_HPMCOUNTER31H) {\n-        ctr_index = csrno - CSR_CYCLEH;\n-    } else {\n-        return RISCV_EXCP_ILLEGAL_INST;\n-    }\n-\n-    return riscv_pmu_read_ctr(env, val, true, ctr_index);\n+    uint32_t ctr_idx = riscv_pmu_csrno_to_ctr_idx(csrno);\n+    return riscv_pmu_read_ctr(env, val, true, ctr_idx);\n }\n \n static int rmw_cd_mhpmcounter(CPURISCVState *env, int ctr_idx,\n@@ -1599,8 +1574,8 @@ static int rmw_cd_ctr_cfgh(CPURISCVState *env, int cfg_index, target_ulong *val,\n static RISCVException read_scountovf(CPURISCVState *env, int csrno,\n                                      target_ulong *val)\n {\n-    int mhpmevt_start = CSR_MHPMEVENT3 - CSR_MCOUNTINHIBIT;\n-    int i;\n+    uint32_t mhpmevt_start = riscv_pmu_csrno_to_ctr_idx(CSR_MHPMEVENT3);\n+    uint32_t i;\n     *val = 0;\n     target_ulong *mhpm_evt_val;\n     uint64_t of_bit_mask;\ndiff --git a/target/riscv/pmu.c b/target/riscv/pmu.c\nindex a68809eef3..b983eadd83 100644\n--- a/target/riscv/pmu.c\n+++ b/target/riscv/pmu.c\n@@ -600,3 +600,47 @@ void riscv_pmu_init(RISCVCPU *cpu, Error **errp)\n \n     cpu->pmu_avail_ctrs = cpu->cfg.pmu_mask;\n }\n+\n+uint32_t riscv_pmu_csrno_to_ctr_idx(int csrno)\n+{\n+    #define CASE_RANGE(low, high, offset) { \\\n+        case (low)...(high): \\\n+            return csrno - (low) + (offset); \\\n+    }\n+    #define HPMCOUNTER_START (HPM_MINSTRET_IDX + 1)\n+\n+    switch (csrno) {\n+    CASE_RANGE(CSR_MHPMEVENT3, CSR_MHPMEVENT31, HPMCOUNTER_START)\n+    CASE_RANGE(CSR_MHPMEVENT3H, CSR_MHPMEVENT31H, HPMCOUNTER_START)\n+    CASE_RANGE(CSR_HPMCOUNTER3, CSR_HPMCOUNTER31, HPMCOUNTER_START)\n+    CASE_RANGE(CSR_HPMCOUNTER3H, CSR_HPMCOUNTER31H, HPMCOUNTER_START)\n+    CASE_RANGE(CSR_MHPMCOUNTER3, CSR_MHPMCOUNTER31, HPMCOUNTER_START)\n+    CASE_RANGE(CSR_MHPMCOUNTER3H, CSR_MHPMCOUNTER31H, HPMCOUNTER_START)\n+\n+    case CSR_MCYCLE:\n+    case CSR_MCYCLEH:\n+    case CSR_CYCLE:\n+    case CSR_CYCLEH:\n+    case CSR_MCYCLECFG:\n+    case CSR_MCYCLECFGH:\n+        return HPM_MCYCLE_IDX;\n+\n+    case CSR_MINSTRET:\n+    case CSR_MINSTRETH:\n+    case CSR_INSTRET:\n+    case CSR_INSTRETH:\n+    case CSR_MINSTRETCFG:\n+    case CSR_MINSTRETCFGH:\n+        return HPM_MINSTRET_IDX;\n+\n+    case CSR_TIME:\n+    case CSR_TIMEH:\n+        return HPM_MTIME_IDX;\n+\n+    default:\n+        g_assert_not_reached();\n+    }\n+\n+    #undef HPMCOUNTER_START\n+    #undef CASE_RANGE\n+}\ndiff --git a/target/riscv/pmu.h b/target/riscv/pmu.h\nindex 3853d0e262..8f019bea9f 100644\n--- a/target/riscv/pmu.h\n+++ b/target/riscv/pmu.h\n@@ -38,5 +38,6 @@ void riscv_pmu_update_fixed_ctrs(CPURISCVState *env, target_ulong newpriv,\n                                  bool new_virt);\n RISCVException riscv_pmu_read_ctr(CPURISCVState *env, target_ulong *val,\n                                   bool upper_half, uint32_t ctr_idx);\n+uint32_t riscv_pmu_csrno_to_ctr_idx(int csrno);\n \n #endif /* RISCV_PMU_H */\n","prefixes":["RFC","1/6"]}