On Fri, 25 Jul 2025 at 15:38, Gustavo Romero <gustavo.rom...@linaro.org> wrote:
>
> Hi Phil,
>
> On 7/25/25 10:18, Philippe Mathieu-Daudé wrote:
> > Hi Gustavo,
> >
> > On 25/7/25 03:47, Gustavo Romero wrote:
> >>           if (stage2idx == ARMMMUIdx_Stage2_S) {
> >> -            s2walk_secure = !(env->cp15.vstcr_el2 & VSTCR_SW);
> >> +            s2walk_secure = !(env->cp15.vstcr_el2 & R_VSTCR_SW_MASK);
> >
> > FYI register API provides helper macros:
> >
> >              s2walk_secure = !FIELD_EX32(env->cp15.vstcr_el2, VSTCR, SW);
> >
>
> Do you know which form is currently preferred? I see that 
> R_<REGNAME>_<FIELD>_MASK is used a lot, .e.g, in helper.c.

Where a mask is the most simple or useful way to get what
you want, it's fine to use R_*_MASK directly; for instance
in this patch
 (env->cp15.vstcr_el2 & (R_VSTCR_SA_MASK | R_VSTCR_SW_MASK)
is better than
 (FIELD_EX64(env->cp15.vstcr_el2, VSTCR, SA) ||
  FIELD_EX64(env->cp15.vstcr_el2, VSTCR, SW))
and
  value |= R_FOO_BAR_MASK;
seems simpler than
  value = FIELD_DP64(value, FOO, BAR, 1);

I think (though this is to some extent a matter of personal taste).

Where we're using the mask to test whether a single bit field
is set or not, you could do it either way. I think in new code
I would probably use the FIELD_EX64 macro, but a test against
the mask value is fine too.

> Also, even tho the SW field in VSTCR is <= 31, VSTCR is a 64-bit register, so 
> should I really use FIELD_EX32 (which works) or FIELD_EX64 (my first thought 
> would be to use it, i.e. based on the register size, not the field)?

Use FIELD_EX64 for working on 64-bit values, yes.

Personally I don't feel strongly about any of this, so I
would be happy taking this patch the way it is.

-- PMM

Reply via email to