[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 2/6] target/riscv: Introduce extension implied rule helper
From: |
Alistair Francis |
Subject: |
Re: [PATCH v3 2/6] target/riscv: Introduce extension implied rule helpers |
Date: |
Wed, 26 Jun 2024 09:53:48 +1000 |
On Tue, Jun 25, 2024 at 9:47 PM <frank.chang@sifive.com> wrote:
>
> From: Frank Chang <frank.chang@sifive.com>
>
> Introduce helpers to enable the extensions based on the implied rules.
> The implied extensions are enabled recursively, so we don't have to
> expand all of them manually. This also eliminates the old-fashioned
> ordering requirement. For example, Zvksg implies Zvks, Zvks implies
> Zvksed, etc., removing the need to check the implied rules of Zvksg
> before Zvks.
>
> Signed-off-by: Frank Chang <frank.chang@sifive.com>
> Reviewed-by: Jerry Zhang Jian <jerry.zhangjian@sifive.com>
> Tested-by: Max Chou <max.chou@sifive.com>
> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/tcg/tcg-cpu.c | 121 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 121 insertions(+)
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index eb6f7b9d12..1a3aef5bff 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -31,11 +31,17 @@
> #include "hw/core/accel-cpu.h"
> #include "hw/core/tcg-cpu-ops.h"
> #include "tcg/tcg.h"
> +#ifndef CONFIG_USER_ONLY
> +#include "hw/boards.h"
> +#endif
>
> /* Hash that stores user set extensions */
> static GHashTable *multi_ext_user_opts;
> static GHashTable *misa_ext_user_opts;
>
> +static GHashTable *multi_ext_implied_rules;
> +static GHashTable *misa_ext_implied_rules;
> +
> static bool cpu_cfg_ext_is_user_set(uint32_t ext_offset)
> {
> return g_hash_table_contains(multi_ext_user_opts,
> @@ -836,11 +842,117 @@ static void riscv_cpu_validate_profiles(RISCVCPU *cpu)
> }
> }
>
> +static void riscv_cpu_init_implied_exts_rules(void)
> +{
> + RISCVCPUImpliedExtsRule *rule;
> +#ifndef CONFIG_USER_ONLY
> + MachineState *ms = MACHINE(qdev_get_machine());
> +#endif
> + static bool initialized;
> + int i;
> +
> + /* Implied rules only need to be initialized once. */
> + if (initialized) {
> + return;
> + }
> +
> + for (i = 0; (rule = riscv_misa_ext_implied_rules[i]); i++) {
> +#ifndef CONFIG_USER_ONLY
> + rule->enabled = bitmap_new(ms->smp.cpus);
> +#endif
> + g_hash_table_insert(misa_ext_implied_rules,
> + GUINT_TO_POINTER(rule->ext), (gpointer)rule);
> + }
> +
> + for (i = 0; (rule = riscv_multi_ext_implied_rules[i]); i++) {
> +#ifndef CONFIG_USER_ONLY
> + rule->enabled = bitmap_new(ms->smp.cpus);
> +#endif
> + g_hash_table_insert(multi_ext_implied_rules,
> + GUINT_TO_POINTER(rule->ext), (gpointer)rule);
> + }
> +
> + initialized = true;
> +}
> +
> +static void cpu_enable_implied_rule(RISCVCPU *cpu,
> + RISCVCPUImpliedExtsRule *rule)
> +{
> + CPURISCVState *env = &cpu->env;
> + RISCVCPUImpliedExtsRule *ir;
> + bool enabled = false;
> + int i;
> +
> +#ifndef CONFIG_USER_ONLY
> + enabled = test_bit(cpu->env.mhartid, rule->enabled);
> +#endif
> +
> + if (!enabled) {
> + /* Enable the implied MISAs. */
> + if (rule->implied_misa_exts) {
> + riscv_cpu_set_misa_ext(env,
> + env->misa_ext | rule->implied_misa_exts);
> +
> + for (i = 0; misa_bits[i] != 0; i++) {
> + if (rule->implied_misa_exts & misa_bits[i]) {
> + ir = g_hash_table_lookup(misa_ext_implied_rules,
> + GUINT_TO_POINTER(misa_bits[i]));
> +
> + if (ir) {
> + cpu_enable_implied_rule(cpu, ir);
> + }
> + }
> + }
> + }
> +
> + /* Enable the implied extensions. */
> + for (i = 0;
> + rule->implied_multi_exts[i] != RISCV_IMPLIED_EXTS_RULE_END;
> i++) {
> + cpu_cfg_ext_auto_update(cpu, rule->implied_multi_exts[i], true);
> +
> + ir = g_hash_table_lookup(multi_ext_implied_rules,
> + GUINT_TO_POINTER(
> + rule->implied_multi_exts[i]));
> +
> + if (ir) {
> + cpu_enable_implied_rule(cpu, ir);
> + }
> + }
> +
> +#ifndef CONFIG_USER_ONLY
> + bitmap_set(rule->enabled, cpu->env.mhartid, 1);
> +#endif
> + }
> +}
> +
> +static void riscv_cpu_enable_implied_rules(RISCVCPU *cpu)
> +{
> + RISCVCPUImpliedExtsRule *rule;
> + int i;
> +
> + /* 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_implied_rule(cpu, rule);
> + }
> + }
> +
> + /* 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_implied_rule(cpu, rule);
> + }
> + }
> +}
> +
> void riscv_tcg_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
> {
> CPURISCVState *env = &cpu->env;
> Error *local_err = NULL;
>
> + riscv_cpu_init_implied_exts_rules();
> + riscv_cpu_enable_implied_rules(cpu);
> +
> riscv_cpu_validate_misa_priv(env, &local_err);
> if (local_err != NULL) {
> error_propagate(errp, local_err);
> @@ -1346,6 +1458,15 @@ static void riscv_tcg_cpu_instance_init(CPUState *cs)
>
> misa_ext_user_opts = g_hash_table_new(NULL, g_direct_equal);
> multi_ext_user_opts = g_hash_table_new(NULL, g_direct_equal);
> +
> + if (!misa_ext_implied_rules) {
> + misa_ext_implied_rules = g_hash_table_new(NULL, g_direct_equal);
> + }
> +
> + if (!multi_ext_implied_rules) {
> + multi_ext_implied_rules = g_hash_table_new(NULL, g_direct_equal);
> + }
> +
> riscv_cpu_add_user_properties(obj);
>
> if (riscv_cpu_has_max_extensions(obj)) {
> --
> 2.43.2
>
>
- [PATCH v3 0/6] Introduce extension implied rules, frank . chang, 2024/06/25
- [PATCH v3 1/6] target/riscv: Introduce extension implied rules definition, frank . chang, 2024/06/25
- [PATCH v3 2/6] target/riscv: Introduce extension implied rule helpers, frank . chang, 2024/06/25
- Re: [PATCH v3 2/6] target/riscv: Introduce extension implied rule helpers,
Alistair Francis <=
- [PATCH v3 4/6] target/riscv: Add multi extension implied rules, frank . chang, 2024/06/25
- [PATCH v3 3/6] target/riscv: Add MISA extension implied rules, frank . chang, 2024/06/25
- [PATCH v3 5/6] target/riscv: Add Zc extension implied rule, frank . chang, 2024/06/25
- [PATCH v3 6/6] target/riscv: Remove extension auto-update check statements, frank . chang, 2024/06/25
- Re: [PATCH v3 0/6] Introduce extension implied rules, Alistair Francis, 2024/06/25