We don't actually test SIGILL generation for CMPBR since the need to
branch makes it a pain to generate and the SIGILL detection would be
unreliable anyway. Since this should be very unusual we provide a stub
function rather than supporting a missing function.

The sigill functions aren't well sorted in the file so the ordering is a
bit random.

Signed-off-by: Mark Brown <broo...@kernel.org>
---
 tools/testing/selftests/arm64/abi/hwcap.c | 273 +++++++++++++++++++++++++++++-
 1 file changed, 271 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/arm64/abi/hwcap.c 
b/tools/testing/selftests/arm64/abi/hwcap.c
index 
f2d6007a2b983eba77a880ec7e614396a6cb1377..beb380bc09b0d07269a85a60e5d2977367740473
 100644
--- a/tools/testing/selftests/arm64/abi/hwcap.c
+++ b/tools/testing/selftests/arm64/abi/hwcap.c
@@ -46,6 +46,12 @@ static void atomics_sigill(void)
        asm volatile(".inst 0xb82003ff" : : : );
 }
 
+static void cmpbr_sigill(void)
+{
+       /* Not implemented, too complicated and unreliable anyway */
+}
+
+
 static void crc32_sigill(void)
 {
        /* CRC32W W0, W0, W1 */
@@ -82,6 +88,18 @@ static void f8fma_sigill(void)
        asm volatile(".inst 0xec0fc00");
 }
 
+static void f8mm4_sigill(void)
+{
+       /* FMMLA V0.4SH, V0.16B, V0.16B */
+       asm volatile(".inst 0x6e00ec00");
+}
+
+static void f8mm8_sigill(void)
+{
+       /* FMMLA V0.4S, V0.16B, V0.16B */
+       asm volatile(".inst 0x6e80ec00");
+}
+
 static void faminmax_sigill(void)
 {
        /* FAMIN V0.4H, V0.4H, V0.4H */
@@ -98,6 +116,12 @@ static void fpmr_sigill(void)
        asm volatile("mrs x0, S3_3_C4_C4_2" : : : "x0");
 }
 
+static void fprcvt_sigill(void)
+{
+       /* FCVTAS S0, H0 */
+       asm volatile(".inst 0x1efa0000");
+}
+
 static void ilrcpc_sigill(void)
 {
        /* LDAPUR W0, [SP, #8] */
@@ -215,6 +239,42 @@ static void sme2p1_sigill(void)
        asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
 }
 
+static void sme2p2_sigill(void)
+{
+       /* SMSTART SM */
+       asm volatile("msr S0_3_C4_C3_3, xzr" : : : );
+
+       /* UXTB Z0.D, P0/Z, Z0.D  */
+       asm volatile(".inst 0x4c1a000" : : : );
+
+       /* SMSTOP */
+       asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
+static void sme_aes_sigill(void)
+{
+       /* SMSTART SM */
+       asm volatile("msr S0_3_C4_C3_3, xzr" : : : );
+
+       /* AESD z0.b, z0.b, z0.b */
+       asm volatile(".inst 0x4522e400" : : : "z0");
+
+       /* SMSTOP */
+       asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
+static void sme_sbitperm_sigill(void)
+{
+       /* SMSTART SM */
+       asm volatile("msr S0_3_C4_C3_3, xzr" : : : );
+
+       /* BDEP Z0.B, Z0.B, Z0.B */
+       asm volatile(".inst 0x4500b400" : : : "z0");
+
+       /* SMSTOP */
+       asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
 static void smei16i32_sigill(void)
 {
        /* SMSTART */
@@ -323,13 +383,73 @@ static void smesf8dp4_sigill(void)
        asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
 }
 
+static void smesf8mm8_sigill(void)
+{
+       /* SMSTART */
+       asm volatile("msr S0_3_C4_C7_3, xzr" : : : );
+
+       /* FMMLA V0.4S, V0.16B, V0.16B */
+       asm volatile(".inst 0x6e80ec00");
+
+       /* SMSTOP */
+       asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
+static void smesf8mm4_sigill(void)
+{
+       /* SMSTART */
+       asm volatile("msr S0_3_C4_C7_3, xzr" : : : );
+
+       /* FMMLA V0.4SH, V0.16B, V0.16B */
+       asm volatile(".inst 0x6e00ec00");
+
+       /* SMSTOP */
+       asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
 static void smesf8fma_sigill(void)
 {
        /* SMSTART */
        asm volatile("msr S0_3_C4_C7_3, xzr" : : : );
 
-       /* FMLALB V0.8H, V0.16B, V0.16B */
-       asm volatile(".inst 0xec0fc00");
+       /* FMLALB Z0.8H, Z0.B, Z0.B */
+       asm volatile(".inst 0x64205000");
+
+       /* SMSTOP */
+       asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
+static void smesfexpa_sigill(void)
+{
+       /* SMSTART */
+       asm volatile("msr S0_3_C4_C7_3, xzr" : : : );
+
+       /* FEXPA Z0.D, Z0.D */
+       asm volatile(".inst 0x04e0b800");
+
+       /* SMSTOP */
+       asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
+static void smesmop4_sigill(void)
+{
+       /* SMSTART */
+       asm volatile("msr S0_3_C4_C7_3, xzr" : : : );
+
+       /* SMOP4A ZA0.S, Z0.B, { Z0.B - Z1.B } */
+       asm volatile(".inst 0x80108000");
+
+       /* SMSTOP */
+       asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
+}
+
+static void smestmop_sigill(void)
+{
+       /* SMSTART */
+       asm volatile("msr S0_3_C4_C7_3, xzr" : : : );
+
+       /* STMOPA ZA0.S, { Z0.H - Z1.H }, Z0.H, Z20[0] */
+       asm volatile(".inst 0x80408008");
 
        /* SMSTOP */
        asm volatile("msr S0_3_C4_C6_3, xzr" : : : );
@@ -353,18 +473,42 @@ static void sve2p1_sigill(void)
        asm volatile(".inst 0x65000000" : : : "z0");
 }
 
+static void sve2p2_sigill(void)
+{
+       /* NOT Z0.D, P0/Z, Z0.D */
+       asm volatile(".inst 0x4cea000" : : : "z0");
+}
+
 static void sveaes_sigill(void)
 {
        /* AESD z0.b, z0.b, z0.b */
        asm volatile(".inst 0x4522e400" : : : "z0");
 }
 
+static void sveaes2_sigill(void)
+{
+       /* AESD {Z0.B - Z1.B }, { Z0.B - Z1.B }, Z0.Q */
+       asm volatile(".inst 0x4522ec00" : : : "z0");
+}
+
 static void sveb16b16_sigill(void)
 {
        /* BFADD ZA.H[W0, 0], {Z0.H-Z1.H} */
        asm volatile(".inst 0xC1E41C00" : : : );
 }
 
+static void svebfscale_sigill(void)
+{
+       /* BFSCALE Z0.H, P0/M, Z0.H, Z0.H */
+       asm volatile(".inst 0x65098000" : : : "z0");
+}
+
+static void svef16mm_sigill(void)
+{
+       /* FMMLA Z0.S, Z0.H, Z0.H */
+       asm volatile(".inst 0x6420e400");
+}
+
 static void svepmull_sigill(void)
 {
        /* PMULLB Z0.Q, Z0.D, Z0.D */
@@ -383,6 +527,12 @@ static void svesha3_sigill(void)
        asm volatile(".inst 0x4203800" : : : "z0");
 }
 
+static void sveeltperm_sigill(void)
+{
+       /* COMPACT Z0.B, P0, Z0.B */
+       asm volatile(".inst 0x5218000" : : : "x0");
+}
+
 static void svesm4_sigill(void)
 {
        /* SM4E Z0.S, Z0.S, Z0.S */
@@ -458,6 +608,13 @@ static const struct hwcap_data {
                .cpuinfo = "aes",
                .sigill_fn = aes_sigill,
        },
+       {
+               .name = "CMPBR",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_CMPBR,
+               .cpuinfo = "cmpbr",
+               .sigill_fn = cmpbr_sigill,
+       },
        {
                .name = "CRC32",
                .at_hwcap = AT_HWCAP,
@@ -512,6 +669,20 @@ static const struct hwcap_data {
                .cpuinfo = "f8fma",
                .sigill_fn = f8fma_sigill,
        },
+       {
+               .name = "F8MM8",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_F8MM8,
+               .cpuinfo = "f8mm8",
+               .sigill_fn = f8mm8_sigill,
+       },
+       {
+               .name = "F8MM4",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_F8MM4,
+               .cpuinfo = "f8mm4",
+               .sigill_fn = f8mm4_sigill,
+       },
        {
                .name = "FAMINMAX",
                .at_hwcap = AT_HWCAP2,
@@ -534,6 +705,13 @@ static const struct hwcap_data {
                .sigill_fn = fpmr_sigill,
                .sigill_reliable = true,
        },
+       {
+               .name = "FPRCVT",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_FPRCVT,
+               .cpuinfo = "fprcvt",
+               .sigill_fn = fprcvt_sigill,
+       },
        {
                .name = "JSCVT",
                .at_hwcap = AT_HWCAP,
@@ -672,6 +850,20 @@ static const struct hwcap_data {
                .cpuinfo = "sme2p1",
                .sigill_fn = sme2p1_sigill,
        },
+       {
+               .name = "SME 2.2",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SME2P2,
+               .cpuinfo = "sme2p2",
+               .sigill_fn = sme2p2_sigill,
+       },
+       {
+               .name = "SME AES",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SME_AES,
+               .cpuinfo = "smeaes",
+               .sigill_fn = sme_aes_sigill,
+       },
        {
                .name = "SME I16I32",
                .at_hwcap = AT_HWCAP2,
@@ -721,6 +913,13 @@ static const struct hwcap_data {
                .cpuinfo = "smelutv2",
                .sigill_fn = smelutv2_sigill,
        },
+       {
+               .name = "SME SBITPERM",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SME_SBITPERM,
+               .cpuinfo = "smesbitperm",
+               .sigill_fn = sme_sbitperm_sigill,
+       },
        {
                .name = "SME SF8FMA",
                .at_hwcap = AT_HWCAP2,
@@ -728,6 +927,20 @@ static const struct hwcap_data {
                .cpuinfo = "smesf8fma",
                .sigill_fn = smesf8fma_sigill,
        },
+       {
+               .name = "SME SF8MM8",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SME_SF8MM8,
+               .cpuinfo = "smesf8mm8",
+               .sigill_fn = smesf8mm8_sigill,
+       },
+       {
+               .name = "SME SF8MM4",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SME_SF8MM8,
+               .cpuinfo = "smesf8mm4",
+               .sigill_fn = smesf8mm4_sigill,
+       },
        {
                .name = "SME SF8DP2",
                .at_hwcap = AT_HWCAP2,
@@ -742,6 +955,27 @@ static const struct hwcap_data {
                .cpuinfo = "smesf8dp4",
                .sigill_fn = smesf8dp4_sigill,
        },
+       {
+               .name = "SME SFEXPA",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SME_SFEXPA,
+               .cpuinfo = "smesfexpa",
+               .sigill_fn = smesfexpa_sigill,
+       },
+       {
+               .name = "SME SMOP4",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SME_SMOP4,
+               .cpuinfo = "smesmop4",
+               .sigill_fn = smesmop4_sigill,
+       },
+       {
+               .name = "SME STMOP",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SME_STMOP,
+               .cpuinfo = "smestmop",
+               .sigill_fn = smestmop_sigill,
+       },
        {
                .name = "SVE",
                .at_hwcap = AT_HWCAP,
@@ -764,6 +998,13 @@ static const struct hwcap_data {
                .cpuinfo = "sve2p1",
                .sigill_fn = sve2p1_sigill,
        },
+       {
+               .name = "SVE 2.2",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SVE2P2,
+               .cpuinfo = "sve2p2",
+               .sigill_fn = sve2p2_sigill,
+       },
        {
                .name = "SVE AES",
                .at_hwcap = AT_HWCAP2,
@@ -771,6 +1012,34 @@ static const struct hwcap_data {
                .cpuinfo = "sveaes",
                .sigill_fn = sveaes_sigill,
        },
+       {
+               .name = "SVE AES2",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SVE_AES2,
+               .cpuinfo = "sveaes2",
+               .sigill_fn = sveaes2_sigill,
+       },
+       {
+               .name = "SVE BFSCALE",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SVE_BFSCALE,
+               .cpuinfo = "svebfscale",
+               .sigill_fn = svebfscale_sigill,
+       },
+       {
+               .name = "SVE ELTPERM",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SVE_ELTPERM,
+               .cpuinfo = "sveeltperm",
+               .sigill_fn = sveeltperm_sigill,
+       },
+       {
+               .name = "SVE F16MM",
+               .at_hwcap = AT_HWCAP,
+               .hwcap_bit = HWCAP_SVE_F16MM,
+               .cpuinfo = "svef16mm",
+               .sigill_fn = svef16mm_sigill,
+       },
        {
                .name = "SVE2 B16B16",
                .at_hwcap = AT_HWCAP2,

-- 
2.39.2


Reply via email to