[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 2/6] target/riscv: Introduce extension implied rule helpers
From: |
Frank Chang |
Subject: |
Re: [PATCH 2/6] target/riscv: Introduce extension implied rule helpers |
Date: |
Wed, 5 Jun 2024 14:30:47 +0800 |
<frank.chang@sifive.com> 於 2024年6月3日 週一 下午2:06寫道:
>
> 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>
> ---
> target/riscv/tcg/tcg-cpu.c | 84 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 84 insertions(+)
>
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index 683f604d9f..243a8547a2 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -36,6 +36,9 @@
> static GHashTable *multi_ext_user_opts;
> static GHashTable *misa_ext_user_opts;
>
> +static GHashTable *misa_implied_rules;
> +static GHashTable *ext_implied_rules;
> +
> static bool cpu_cfg_ext_is_user_set(uint32_t ext_offset)
> {
> return g_hash_table_contains(multi_ext_user_opts,
> @@ -833,11 +836,90 @@ static void riscv_cpu_validate_profiles(RISCVCPU *cpu)
> }
> }
>
> +static void riscv_cpu_init_implied_exts_rules(void)
> +{
> + RISCVCPUImpliedExtsRule *rule;
> + int i;
> +
> + for (i = 0; (rule = riscv_misa_implied_rules[i]); i++) {
> + g_hash_table_insert(misa_implied_rules, GUINT_TO_POINTER(rule->ext),
> + (gpointer)rule);
> + }
> +
> + for (i = 0; (rule = riscv_ext_implied_rules[i]); i++) {
> + g_hash_table_insert(ext_implied_rules, GUINT_TO_POINTER(rule->ext),
> + (gpointer)rule);
> + }
> +}
> +
> +static void cpu_enable_implied_rule(RISCVCPU *cpu,
> + RISCVCPUImpliedExtsRule *rule)
> +{
> + CPURISCVState *env = &cpu->env;
> + RISCVCPUImpliedExtsRule *ir;
> + int i;
> +
> + if (!rule->enabled) {
Sorry that I found that the rule is not properly applied to the
secondary cores when SMP > 1.
I will fix the issue and resend the patchset.
Regards,
Frank Chang
> + /* Enable the implied MISAs. */
> + if (rule->implied_misas) {
> + riscv_cpu_set_misa_ext(env, env->misa_ext | rule->implied_misas);
> +
> + for (i = 0; misa_bits[i] != 0; i++) {
> + if (rule->implied_misas & misa_bits[i]) {
> + ir = g_hash_table_lookup(misa_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_exts[i] != RISCV_IMPLIED_EXTS_RULE_END;
> i++) {
> + cpu_cfg_ext_auto_update(cpu, rule->implied_exts[i], true);
> +
> + ir = g_hash_table_lookup(ext_implied_rules,
> +
> GUINT_TO_POINTER(rule->implied_exts[i]));
> +
> + if (ir) {
> + cpu_enable_implied_rule(cpu, ir);
> + }
> + }
> +
> + rule->enabled = true;
> + }
> +}
> +
> +static void riscv_cpu_enable_implied_rules(RISCVCPU *cpu)
> +{
> + RISCVCPUImpliedExtsRule *rule;
> + int i;
> +
> + /* Enable the implied MISAs. */
> + for (i = 0; (rule = riscv_misa_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_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);
> @@ -1343,6 +1425,8 @@ 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);
> + misa_implied_rules = g_hash_table_new(NULL, g_direct_equal);
> + 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 0/6] Introduce extension implied rules, frank . chang, 2024/06/03
- [PATCH 1/6] target/riscv: Introduce extension implied rules definition, frank . chang, 2024/06/03
- [PATCH 2/6] target/riscv: Introduce extension implied rule helpers, frank . chang, 2024/06/03
- Re: [PATCH 2/6] target/riscv: Introduce extension implied rule helpers,
Frank Chang <=
- [PATCH 4/6] target/riscv: Add standard extension implied rules, frank . chang, 2024/06/03
- [PATCH 5/6] target/riscv: Add Zc extension implied rule, frank . chang, 2024/06/03
- [PATCH 6/6] target/riscv: Remove extension auto-update check statements, frank . chang, 2024/06/03
- [PATCH 3/6] target/riscv: Add MISA implied rules, frank . chang, 2024/06/03
- Re: [PATCH 0/6] Introduce extension implied rules, Frank Chang, 2024/06/05