From: Atish Patra <atishp@rivosinc.com>
To: qemu-riscv@nongnu.org, qemu-devel@nongnu.org
Cc: palmer@dabbelt.com, liwei1518@gmail.com,
zhiwei_liu@linux.alibaba.com, bin.meng@windriver.com,
dbarboza@ventanamicro.com, alistair.francis@wdc.com
Subject: [PATCH v2 12/13] target/riscv: Add a preferred ISA extension rule
Date: Tue, 23 Jul 2024 16:30:09 -0700 [thread overview]
Message-ID: <20240723-counter_delegation-v2-12-c4170a5348ca@rivosinc.com> (raw)
In-Reply-To: <20240723-counter_delegation-v2-0-c4170a5348ca@rivosinc.com>
In addition to the implied rule, a preferred rule will be useful
where an ISA extension may require a list of ISA extension to be
enabled to use all the features defined in that extension. All
these extensions may not be implied in the ISA.
This patch just introduces a new preferred rule which allows
to enable multiple extensions together without burdening the qemu
commandline user.
Signed-off-by: Atish Patra <atishp@rivosinc.com>
---
target/riscv/cpu.c | 4 ++++
target/riscv/cpu.h | 17 ++++++++++++++
target/riscv/tcg/tcg-cpu.c | 57 ++++++++++++++++++++++++++++++++++++++++------
3 files changed, 71 insertions(+), 7 deletions(-)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 393d1d67120e..22ba43c7ff2a 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -2665,6 +2665,10 @@ RISCVCPUImpliedExtsRule *riscv_multi_ext_implied_rules[] = {
NULL
};
+RISCVCPUPreferredExtsRule *riscv_multi_ext_preferred_rules[] = {
+ NULL
+};
+
static Property riscv_cpu_properties[] = {
DEFINE_PROP_BOOL("debug", RISCVCPU, cfg.debug, true),
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index af25550a4a54..d775866344f5 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -142,10 +142,27 @@ typedef struct riscv_cpu_implied_exts_rule {
const uint32_t implied_multi_exts[];
} RISCVCPUImpliedExtsRule;
+typedef struct riscv_cpu_preferred_exts_rule {
+#ifndef CONFIG_USER_ONLY
+ /*
+ * Bitmask indicates the rule enabled status for the harts.
+ * This enhancement is only available in system-mode QEMU,
+ * as we don't have a good way (e.g. mhartid) to distinguish
+ * the SMP cores in user-mode QEMU.
+ */
+ unsigned long *enabled;
+#endif
+ /* multi extension offset. */
+ const uint32_t ext;
+ const uint32_t preferred_multi_exts[];
+} RISCVCPUPreferredExtsRule;
+
extern RISCVCPUImpliedExtsRule *riscv_misa_ext_implied_rules[];
extern RISCVCPUImpliedExtsRule *riscv_multi_ext_implied_rules[];
+extern RISCVCPUPreferredExtsRule *riscv_multi_ext_preferred_rules[];
#define RISCV_IMPLIED_EXTS_RULE_END -1
+#define RISCV_PREFRRED_EXTS_RULE_END RISCV_IMPLIED_EXTS_RULE_END
#define MMU_USER_IDX 3
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 1c9a87029423..d8f74720815a 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -32,6 +32,7 @@
#include "hw/core/accel-cpu.h"
#include "hw/core/tcg-cpu-ops.h"
#include "tcg/tcg.h"
+#include <stdio.h>
#ifndef CONFIG_USER_ONLY
#include "hw/boards.h"
#endif
@@ -733,6 +734,7 @@ static void riscv_cpu_validate_profiles(RISCVCPU *cpu)
static void riscv_cpu_init_ext_rules(void)
{
RISCVCPUImpliedExtsRule *rule;
+ RISCVCPUPreferredExtsRule *prule;
#ifndef CONFIG_USER_ONLY
MachineState *ms = MACHINE(qdev_get_machine());
#endif
@@ -760,22 +762,40 @@ static void riscv_cpu_init_ext_rules(void)
GUINT_TO_POINTER(rule->ext), (gpointer)rule);
}
+ for (i = 0; (prule = riscv_multi_ext_preferred_rules[i]); i++) {
+#ifndef CONFIG_USER_ONLY
+ prule->enabled = bitmap_new(ms->smp.cpus);
+#endif
+ g_hash_table_insert(multi_ext_enabling_rules,
+ GUINT_TO_POINTER(prule->ext), (gpointer)prule);
+ }
+
initialized = true;
}
static void cpu_enable_ext_rule(RISCVCPU *cpu,
- RISCVCPUImpliedExtsRule *rule)
+ RISCVCPUImpliedExtsRule *rule,
+ RISCVCPUPreferredExtsRule *prule)
{
CPURISCVState *env = &cpu->env;
RISCVCPUImpliedExtsRule *ir;
+ RISCVCPUPreferredExtsRule *pr;
bool enabled = false;
int i;
#ifndef CONFIG_USER_ONLY
- enabled = test_bit(cpu->env.mhartid, rule->enabled);
+ if (rule) {
+ enabled = test_bit(cpu->env.mhartid, rule->enabled);
+ } else if (prule) {
+ enabled = test_bit(cpu->env.mhartid, prule->enabled);
+ } else {
+ return;
+ }
#endif
+ if (enabled)
+ return;
- if (!enabled) {
+ if (rule) {
/* Enable the implied MISAs. */
if (rule->implied_misa_exts) {
riscv_cpu_set_misa_ext(env,
@@ -787,7 +807,7 @@ static void cpu_enable_ext_rule(RISCVCPU *cpu,
GUINT_TO_POINTER(misa_bits[i]));
if (ir) {
- cpu_enable_ext_rule(cpu, ir);
+ cpu_enable_ext_rule(cpu, ir, NULL);
}
}
}
@@ -803,12 +823,27 @@ static void cpu_enable_ext_rule(RISCVCPU *cpu,
rule->implied_multi_exts[i]));
if (ir) {
- cpu_enable_ext_rule(cpu, ir);
+ cpu_enable_ext_rule(cpu, ir, NULL);
}
}
#ifndef CONFIG_USER_ONLY
bitmap_set(rule->enabled, cpu->env.mhartid, 1);
+#endif
+ } else if (prule) {
+ /* Enable the preferred extensions. */
+ for (i = 0;
+ prule->preferred_multi_exts[i] != RISCV_PREFRRED_EXTS_RULE_END; i++) {
+ cpu_cfg_ext_auto_update(cpu, prule->preferred_multi_exts[i], true);
+ pr = g_hash_table_lookup(multi_ext_enabling_rules,
+ GUINT_TO_POINTER(
+ prule->preferred_multi_exts[i]));
+ if (pr) {
+ cpu_enable_ext_rule(cpu, NULL, prule);
+ }
+ }
+#ifndef CONFIG_USER_ONLY
+ bitmap_set(prule->enabled, cpu->env.mhartid, 1);
#endif
}
}
@@ -847,6 +882,7 @@ static void cpu_enable_zc_implied_rules(RISCVCPU *cpu)
static void riscv_cpu_enable_ext_rules(RISCVCPU *cpu)
{
RISCVCPUImpliedExtsRule *rule;
+ RISCVCPUPreferredExtsRule *prule;
int i;
/* Enable the implied extensions for Zc. */
@@ -855,14 +891,21 @@ static void riscv_cpu_enable_ext_rules(RISCVCPU *cpu)
/* Enable the implied MISAs. */
for (i = 0; (rule = riscv_misa_ext_implied_rules[i]); i++) {
if (riscv_has_ext(&cpu->env, rule->ext)) {
- cpu_enable_ext_rule(cpu, rule);
+ cpu_enable_ext_rule(cpu, rule, NULL);
}
}
/* Enable the implied extensions. */
for (i = 0; (rule = riscv_multi_ext_implied_rules[i]); i++) {
if (isa_ext_is_enabled(cpu, rule->ext)) {
- cpu_enable_ext_rule(cpu, rule);
+ cpu_enable_ext_rule(cpu, rule, NULL);
+ }
+ }
+
+ /* Enable the preferred extensions. */
+ for (i = 0; (prule = riscv_multi_ext_preferred_rules[i]); i++) {
+ if (isa_ext_is_enabled(cpu, prule->ext)) {
+ cpu_enable_ext_rule(cpu, NULL, prule);
}
}
}
--
2.34.1
next prev parent reply other threads:[~2024-07-23 23:32 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-23 23:29 [PATCH v2 00/13] Add RISC-V Counter delegation ISA extension support Atish Patra
2024-07-23 23:29 ` [PATCH v2 01/13] target/riscv: Add properties for Indirect CSR Access extension Atish Patra
2024-07-26 7:42 ` Alistair Francis
2024-07-27 1:33 ` Atish Kumar Patra
2024-07-31 9:24 ` Alistair Francis
2024-08-07 7:53 ` Atish Kumar Patra
2024-07-23 23:29 ` [PATCH v2 02/13] target/riscv: Decouple AIA processing from xiselect and xireg Atish Patra
2024-08-06 0:05 ` Alistair Francis
2024-07-23 23:30 ` [PATCH v2 03/13] target/riscv: Enable S*stateen bits for AIA Atish Patra
2024-08-06 0:12 ` Alistair Francis
2024-08-07 7:53 ` Atish Kumar Patra
2024-07-23 23:30 ` [PATCH v2 04/13] target/riscv: Support generic CSR indirect access Atish Patra
2024-08-06 0:15 ` Alistair Francis
2024-08-07 7:50 ` Atish Kumar Patra
2024-07-23 23:30 ` [PATCH v2 05/13] target/riscv: Add counter delegation definitions Atish Patra
2024-08-06 0:36 ` Alistair Francis
2024-07-23 23:30 ` [PATCH v2 06/13] target/riscv: Add select value range check for counter delegation Atish Patra
2024-08-06 0:41 ` Alistair Francis
2024-07-23 23:30 ` [PATCH v2 07/13] target/riscv: Add counter delegation/configuration support Atish Patra
2024-08-06 1:21 ` Alistair Francis
2024-08-07 7:48 ` Atish Kumar Patra
2024-07-23 23:30 ` [PATCH v2 08/13] target/riscv: Add configuration for S[m|s]csrind, Smcdeleg/Ssccfg Atish Patra
2024-08-06 1:22 ` Alistair Francis
2024-07-23 23:30 ` [PATCH v2 09/13] target/riscv: Invoke pmu init after feature enable Atish Patra
2024-08-06 1:43 ` Alistair Francis
2024-07-23 23:30 ` [PATCH v2 10/13] target/riscv: Enable sscofpmf for bare cpu by default Atish Patra
2024-08-06 1:51 ` Alistair Francis
2024-08-06 8:27 ` Andrew Jones
2024-07-23 23:30 ` [PATCH v2 11/13] target/riscv: Repurpose the implied rule startergy Atish Patra
2024-07-23 23:30 ` Atish Patra [this message]
2024-08-06 1:48 ` [PATCH v2 12/13] target/riscv: Add a preferred ISA extension rule Alistair Francis
2024-08-07 7:46 ` Atish Kumar Patra
2024-07-23 23:30 ` [PATCH v2 13/13] target/riscv: Enable PMU related extensions to preferred rule Atish Patra
2024-08-06 8:46 ` Andrew Jones
2024-08-06 16:05 ` Daniel Henrique Barboza
2024-08-07 2:01 ` Alistair Francis
2024-08-07 7:43 ` Atish Kumar Patra
2024-08-08 0:27 ` Alistair Francis
2024-08-08 8:12 ` Atish Kumar Patra
2024-08-08 8:24 ` Alistair Francis
2024-08-09 21:40 ` Atish Kumar Patra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240723-counter_delegation-v2-12-c4170a5348ca@rivosinc.com \
--to=atishp@rivosinc.com \
--cc=alistair.francis@wdc.com \
--cc=bin.meng@windriver.com \
--cc=dbarboza@ventanamicro.com \
--cc=liwei1518@gmail.com \
--cc=palmer@dabbelt.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-riscv@nongnu.org \
--cc=zhiwei_liu@linux.alibaba.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).