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.hender...@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.rom...@linaro.org>


Cheers,
Gustavo

Reply via email to