ASR 26 returns a Compatibility Feature Register (CFR) when the
crypto feature is on.  Without the crypto feature, a read keeps
strand status as before.

Reports AES, SHA1, SHA256, SHA512, CRC32C.
Guests can read the CFR before using each crypto instruction.

Based on OSA (Oracle SPARC Architecture) 2011:
- 5.5 (Ancillary State Registers), table 5-8
- 5.5.11 Compatibility Feature Register (CFR), table 5-15

Signed-off-by: Stian Halseth <[email protected]>
---
 target/sparc/insns.decode |  5 ++++-
 target/sparc/translate.c  | 15 +++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/target/sparc/insns.decode b/target/sparc/insns.decode
index 242ec42016..55f8528ffe 100644
--- a/target/sparc/insns.decode
+++ b/target/sparc/insns.decode
@@ -106,7 +106,10 @@ CALL    01 i:s30
     RDTICK_CMPR     10 rd:5  101000 10111 0 0000000000000
     RDSTICK         10 rd:5  101000 11000 0 0000000000000
     RDSTICK_CMPR    10 rd:5  101000 11001 0 0000000000000
-    RDSTRAND_STATUS 10 rd:5  101000 11010 0 0000000000000
+    {
+      RDCFR           10 rd:5  101000 11010 0 0000000000000
+      RDSTRAND_STATUS 10 rd:5  101000 11010 0 0000000000000
+    }
   ]
 
   # The v8 manual, section B.30 STBAR instruction, says
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
index b93feb074b..00a6988d62 100644
--- a/target/sparc/translate.c
+++ b/target/sparc/translate.c
@@ -3022,6 +3022,21 @@ static TCGv do_rdstrand_status(DisasContext *dc, TCGv 
dst)
 
 TRANS(RDSTRAND_STATUS, HYPV, do_rd_special, true, a->rd, do_rdstrand_status)
 
+/* CFR bits (OSA 2011, 5.5.11) */
+#define CFR_AES         (1 << 0)
+#define CFR_SHA1        (1 << 5)
+#define CFR_SHA256      (1 << 6)
+#define CFR_SHA512      (1 << 7)
+#define CFR_CRC32C      (1 << 11)
+
+static TCGv do_rdcfr(DisasContext *dc, TCGv dst)
+{
+    return tcg_constant_tl(CFR_AES | CFR_SHA1 | CFR_SHA256 |
+                           CFR_SHA512 | CFR_CRC32C);
+}
+
+TRANS(RDCFR, CRYPTO, do_rd_special, true, a->rd, do_rdcfr)
+
 static TCGv do_rdpsr(DisasContext *dc, TCGv dst)
 {
     gen_helper_rdpsr(dst, tcg_env);
-- 
2.43.0


Reply via email to