diff mbox series

[v2,1/5,RISCV_PM] Add J-extension into RISC-V

Message ID 20201015152139.28903-1-space.monkey.delivers@gmail.com
State Superseded
Headers show
Series [v2,1/5,RISCV_PM] Add J-extension into RISC-V | expand

Commit Message

Alexey Baturo Oct. 15, 2020, 3:21 p.m. UTC
Signed-off-by: Alexey Baturo <space.monkey.delivers@gmail.com>
---
 target/riscv/cpu.c | 4 ++++
 target/riscv/cpu.h | 2 ++
 2 files changed, 6 insertions(+)

Comments

Richard Henderson Oct. 15, 2020, 5:07 p.m. UTC | #1
On 10/15/20 8:21 AM, Alexey Baturo wrote:
> +        switch (priv) {
> +        case PRV_U:
> +            pm_enabled = env->mmte & U_PM_ENABLE;
> +            break;
> +        case PRV_S:
> +            pm_enabled = env->mmte & S_PM_ENABLE;
> +            break;
> +        case PRV_M:
> +            pm_enabled = env->mmte & M_PM_ENABLE;
> +            break;
> +        default:
> +            assert(0 && "Unreachable");

g_assert_not_reached();

> +    /* PointerMasking extension */
> +    uint8_t pm_enabled;

bool

> +    if (s->pm_enabled == 0) {

!s->pm_enabled

> +    if (riscv_has_ext(env, RVJ)) {
> +        ctx->pm_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_ENABLED);
> +        int priv = cpu_mmu_index(env, false);
> +        ctx->pm_mask = pm_mask[priv];
> +        ctx->pm_base = pm_base[priv];
> +    } else {
> +        ctx->pm_enabled = 0;
> +    }

Don't need the if.  And should it in fact be placed outside the ifdef?  This
shouldn't be related to !CONFIG_USER_ONLY here and nowhere else.


r~
Alexey Baturo Oct. 15, 2020, 5:33 p.m. UTC | #2
> g_assert_not_reached();
Would fix, thanks.

> bool
Would fix.

>!s->pm_enabled
Same.

> Don't need the if.
Would remove, thanks.

> And should it in fact be placed outside the ifdef?
Sure, you're right.

Richard, thank you for your time and effort reviewing these changes!

чт, 15 окт. 2020 г. в 20:07, Richard Henderson <richard.henderson@linaro.org
>:

> On 10/15/20 8:21 AM, Alexey Baturo wrote:
> > +        switch (priv) {
> > +        case PRV_U:
> > +            pm_enabled = env->mmte & U_PM_ENABLE;
> > +            break;
> > +        case PRV_S:
> > +            pm_enabled = env->mmte & S_PM_ENABLE;
> > +            break;
> > +        case PRV_M:
> > +            pm_enabled = env->mmte & M_PM_ENABLE;
> > +            break;
> > +        default:
> > +            assert(0 && "Unreachable");
>
> g_assert_not_reached();
>
> > +    /* PointerMasking extension */
> > +    uint8_t pm_enabled;
>
> bool
>
> > +    if (s->pm_enabled == 0) {
>
> !s->pm_enabled
>
> > +    if (riscv_has_ext(env, RVJ)) {
> > +        ctx->pm_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_ENABLED);
> > +        int priv = cpu_mmu_index(env, false);
> > +        ctx->pm_mask = pm_mask[priv];
> > +        ctx->pm_base = pm_base[priv];
> > +    } else {
> > +        ctx->pm_enabled = 0;
> > +    }
>
> Don't need the if.  And should it in fact be placed outside the ifdef?
> This
> shouldn't be related to !CONFIG_USER_ONLY here and nowhere else.
>
>
> r~
>
<div dir="ltr">&gt; g_assert_not_reached();<div>Would fix, thanks.</div><div><br></div><div>&gt; bool</div><div>Would fix.</div><div><br></div><div>&gt;!s-&gt;pm_enabled</div><div>Same.</div><div><br></div><div>&gt; Don&#39;t need the if. </div><div>Would remove, thanks.</div><div><br></div><div>&gt; And should it in fact be placed outside the ifdef? </div><div>Sure, you&#39;re right.</div><div><br></div><div>Richard, thank you for your time and effort reviewing these changes!</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">чт, 15 окт. 2020 г. в 20:07, Richard Henderson &lt;<a href="mailto:richard.henderson@linaro.org">richard.henderson@linaro.org</a>&gt;:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 10/15/20 8:21 AM, Alexey Baturo wrote:<br>
&gt; +        switch (priv) {<br>
&gt; +        case PRV_U:<br>
&gt; +            pm_enabled = env-&gt;mmte &amp; U_PM_ENABLE;<br>
&gt; +            break;<br>
&gt; +        case PRV_S:<br>
&gt; +            pm_enabled = env-&gt;mmte &amp; S_PM_ENABLE;<br>
&gt; +            break;<br>
&gt; +        case PRV_M:<br>
&gt; +            pm_enabled = env-&gt;mmte &amp; M_PM_ENABLE;<br>
&gt; +            break;<br>
&gt; +        default:<br>
&gt; +            assert(0 &amp;&amp; &quot;Unreachable&quot;);<br>
<br>
g_assert_not_reached();<br>
<br>
&gt; +    /* PointerMasking extension */<br>
&gt; +    uint8_t pm_enabled;<br>
<br>
bool<br>
<br>
&gt; +    if (s-&gt;pm_enabled == 0) {<br>
<br>
!s-&gt;pm_enabled<br>
<br>
&gt; +    if (riscv_has_ext(env, RVJ)) {<br>
&gt; +        ctx-&gt;pm_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_ENABLED);<br>
&gt; +        int priv = cpu_mmu_index(env, false);<br>
&gt; +        ctx-&gt;pm_mask = pm_mask[priv];<br>
&gt; +        ctx-&gt;pm_base = pm_base[priv];<br>
&gt; +    } else {<br>
&gt; +        ctx-&gt;pm_enabled = 0;<br>
&gt; +    }<br>
<br>
Don&#39;t need the if.  And should it in fact be placed outside the ifdef?  This<br>
shouldn&#39;t be related to !CONFIG_USER_ONLY here and nowhere else.<br>
<br>
<br>
r~<br>
</blockquote></div>
diff mbox series

Patch

diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 0bbfd7f457..fe6bab4a52 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -438,6 +438,9 @@  static void riscv_cpu_realize(DeviceState *dev, Error **errp)
         if (cpu->cfg.ext_h) {
             target_misa |= RVH;
         }
+        if (cpu->cfg.ext_j) {
+            target_misa |= RVJ;
+        }
         if (cpu->cfg.ext_v) {
             target_misa |= RVV;
             if (!is_power_of_2(cpu->cfg.vlen)) {
@@ -516,6 +519,7 @@  static Property riscv_cpu_properties[] = {
     DEFINE_PROP_BOOL("u", RISCVCPU, cfg.ext_u, true),
     /* This is experimental so mark with 'x-' */
     DEFINE_PROP_BOOL("x-h", RISCVCPU, cfg.ext_h, false),
+    DEFINE_PROP_BOOL("x-j", RISCVCPU, cfg.ext_j, false),
     DEFINE_PROP_BOOL("x-v", RISCVCPU, cfg.ext_v, false),
     DEFINE_PROP_BOOL("Counters", RISCVCPU, cfg.ext_counters, true),
     DEFINE_PROP_BOOL("Zifencei", RISCVCPU, cfg.ext_ifencei, true),
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index de275782e6..eca611a367 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -66,6 +66,7 @@ 
 #define RVS RV('S')
 #define RVU RV('U')
 #define RVH RV('H')
+#define RVJ RV('J')
 
 /* S extension denotes that Supervisor mode exists, however it is possible
    to have a core that support S mode but does not have an MMU and there
@@ -277,6 +278,7 @@  struct RISCVCPU {
         bool ext_s;
         bool ext_u;
         bool ext_h;
+        bool ext_j;
         bool ext_v;
         bool ext_counters;
         bool ext_ifencei;