Hi Richard,
On 7/27/25 05:02, Richard Henderson wrote:
> This feature contains only the CHKFEAT instruction. It has
> no ID enable, being back-allocated into the hint nop space.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/arm/tcg/translate-a64.c | 14 ++++++++++++++
> docs/system/arm/emulation.rst | 1 +
> target/arm/tcg/a64.decode | 1 +
> 3 files changed, 16 insertions(+)
>
> diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
> index 7831b3dab3..34d22cac8a 100644
> --- a/target/arm/tcg/translate-a64.c
> +++ b/target/arm/tcg/translate-a64.c
> @@ -2124,6 +2124,20 @@ static bool trans_AUTIBSP(DisasContext *s, arg_AUTIBSP *a)
> return true;
> }
>
> +static bool trans_CHKFEAT(DisasContext *s, arg_CHKFEAT *a)
> +{
> + uint64_t feat_en = 0;
> +
> + if (s->gcs_en) {
> + feat_en |= 1 << 0;
I understand that CHKFEAT is currently only tied to GCS but will cover more features
in the future so we can keep feat_en |= 1 << 0 even if it could gate TCG andi directly
on s->gcs_en and do andi with 0. ok.
It's curious that this instruction is tied to x16, it seems easy to use any other
general purpose register to query for the features.
> + }
> + if (feat_en) {
> + TCGv_i64 x16 = cpu_reg(s, 16);
> + tcg_gen_andi_i64(x16, x16, ~feat_en);
> + }
> + return true;
> +}
> +
> static bool trans_CLREX(DisasContext *s, arg_CLREX *a)
> {
> tcg_gen_movi_i64(cpu_exclusive_addr, -1);
> diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
> index 6ebf9c9ce9..b894aced89 100644
> --- a/docs/system/arm/emulation.rst
> +++ b/docs/system/arm/emulation.rst
> @@ -28,6 +28,7 @@ the following architecture extensions:
> - FEAT_BF16 (AArch64 BFloat16 instructions)
> - FEAT_BTI (Branch Target Identification)
> - FEAT_CCIDX (Extended cache index)
> +- FEAT_CHK (Check Feature Status)
> - FEAT_CMOW (Control for cache maintenance permission)
> - FEAT_CRC32 (CRC32 instructions)
> - FEAT_Crypto (Cryptographic Extension)
> diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
> index 8c798cde2b..4315ed8dab 100644
> --- a/target/arm/tcg/a64.decode
> +++ b/target/arm/tcg/a64.decode
> @@ -246,6 +246,7 @@ ERETA 1101011 0100 11111 00001 m:1 11111 11111 &reta # ERETAA, ERETAB
> AUTIASP 1101 0101 0000 0011 0010 0011 101 11111
> AUTIBZ 1101 0101 0000 0011 0010 0011 110 11111
> AUTIBSP 1101 0101 0000 0011 0010 0011 111 11111
> + CHKFEAT 1101 0101 0000 0011 0010 0101 000 11111
> ]
> # The canonical NOP has CRm == op2 == 0, but all of the space
> # that isn't specifically allocated to an instruction must NOP
Reviewed-by: Gustavo Romero <gustavo.romero@linaro.org>
Cheers,
Gustavo