@@ -46,6 +46,12 @@ static void atomics_sigill(void)
46
46
asm volatile (".inst 0xb82003ff" : : : );
47
47
}
48
48
49
+ static void cmpbr_sigill (void )
50
+ {
51
+ /* Not implemented, too complicated and unreliable anyway */
52
+ }
53
+
54
+
49
55
static void crc32_sigill (void )
50
56
{
51
57
/* CRC32W W0, W0, W1 */
@@ -82,6 +88,18 @@ static void f8fma_sigill(void)
82
88
asm volatile (".inst 0xec0fc00" );
83
89
}
84
90
91
+ static void f8mm4_sigill (void )
92
+ {
93
+ /* FMMLA V0.4SH, V0.16B, V0.16B */
94
+ asm volatile (".inst 0x6e00ec00" );
95
+ }
96
+
97
+ static void f8mm8_sigill (void )
98
+ {
99
+ /* FMMLA V0.4S, V0.16B, V0.16B */
100
+ asm volatile (".inst 0x6e80ec00" );
101
+ }
102
+
85
103
static void faminmax_sigill (void )
86
104
{
87
105
/* FAMIN V0.4H, V0.4H, V0.4H */
@@ -98,6 +116,12 @@ static void fpmr_sigill(void)
98
116
asm volatile ("mrs x0, S3_3_C4_C4_2" : : : "x0" );
99
117
}
100
118
119
+ static void fprcvt_sigill (void )
120
+ {
121
+ /* FCVTAS S0, H0 */
122
+ asm volatile (".inst 0x1efa0000" );
123
+ }
124
+
101
125
static void gcs_sigill (void )
102
126
{
103
127
unsigned long * gcspr ;
@@ -226,6 +250,42 @@ static void sme2p1_sigill(void)
226
250
asm volatile ("msr S0_3_C4_C6_3, xzr" : : : );
227
251
}
228
252
253
+ static void sme2p2_sigill (void )
254
+ {
255
+ /* SMSTART SM */
256
+ asm volatile ("msr S0_3_C4_C3_3, xzr" : : : );
257
+
258
+ /* UXTB Z0.D, P0/Z, Z0.D */
259
+ asm volatile (".inst 0x4c1a000" : : : );
260
+
261
+ /* SMSTOP */
262
+ asm volatile ("msr S0_3_C4_C6_3, xzr" : : : );
263
+ }
264
+
265
+ static void sme_aes_sigill (void )
266
+ {
267
+ /* SMSTART SM */
268
+ asm volatile ("msr S0_3_C4_C3_3, xzr" : : : );
269
+
270
+ /* AESD z0.b, z0.b, z0.b */
271
+ asm volatile (".inst 0x4522e400" : : : "z0" );
272
+
273
+ /* SMSTOP */
274
+ asm volatile ("msr S0_3_C4_C6_3, xzr" : : : );
275
+ }
276
+
277
+ static void sme_sbitperm_sigill (void )
278
+ {
279
+ /* SMSTART SM */
280
+ asm volatile ("msr S0_3_C4_C3_3, xzr" : : : );
281
+
282
+ /* BDEP Z0.B, Z0.B, Z0.B */
283
+ asm volatile (".inst 0x4500b400" : : : "z0" );
284
+
285
+ /* SMSTOP */
286
+ asm volatile ("msr S0_3_C4_C6_3, xzr" : : : );
287
+ }
288
+
229
289
static void smei16i32_sigill (void )
230
290
{
231
291
/* SMSTART */
@@ -339,8 +399,44 @@ static void smesf8fma_sigill(void)
339
399
/* SMSTART */
340
400
asm volatile ("msr S0_3_C4_C7_3, xzr" : : : );
341
401
342
- /* FMLALB V0.8H, V0.16B, V0.16B */
343
- asm volatile (".inst 0xec0fc00" );
402
+ /* FMLALB Z0.8H, Z0.B, Z0.B */
403
+ asm volatile (".inst 0x64205000" );
404
+
405
+ /* SMSTOP */
406
+ asm volatile ("msr S0_3_C4_C6_3, xzr" : : : );
407
+ }
408
+
409
+ static void smesfexpa_sigill (void )
410
+ {
411
+ /* SMSTART */
412
+ asm volatile ("msr S0_3_C4_C7_3, xzr" : : : );
413
+
414
+ /* FEXPA Z0.D, Z0.D */
415
+ asm volatile (".inst 0x04e0b800" );
416
+
417
+ /* SMSTOP */
418
+ asm volatile ("msr S0_3_C4_C6_3, xzr" : : : );
419
+ }
420
+
421
+ static void smesmop4_sigill (void )
422
+ {
423
+ /* SMSTART */
424
+ asm volatile ("msr S0_3_C4_C7_3, xzr" : : : );
425
+
426
+ /* SMOP4A ZA0.S, Z0.B, { Z0.B - Z1.B } */
427
+ asm volatile (".inst 0x80108000" );
428
+
429
+ /* SMSTOP */
430
+ asm volatile ("msr S0_3_C4_C6_3, xzr" : : : );
431
+ }
432
+
433
+ static void smestmop_sigill (void )
434
+ {
435
+ /* SMSTART */
436
+ asm volatile ("msr S0_3_C4_C7_3, xzr" : : : );
437
+
438
+ /* STMOPA ZA0.S, { Z0.H - Z1.H }, Z0.H, Z20[0] */
439
+ asm volatile (".inst 0x80408008" );
344
440
345
441
/* SMSTOP */
346
442
asm volatile ("msr S0_3_C4_C6_3, xzr" : : : );
@@ -364,18 +460,42 @@ static void sve2p1_sigill(void)
364
460
asm volatile (".inst 0x65000000" : : : "z0" );
365
461
}
366
462
463
+ static void sve2p2_sigill (void )
464
+ {
465
+ /* NOT Z0.D, P0/Z, Z0.D */
466
+ asm volatile (".inst 0x4cea000" : : : "z0" );
467
+ }
468
+
367
469
static void sveaes_sigill (void )
368
470
{
369
471
/* AESD z0.b, z0.b, z0.b */
370
472
asm volatile (".inst 0x4522e400" : : : "z0" );
371
473
}
372
474
475
+ static void sveaes2_sigill (void )
476
+ {
477
+ /* AESD {Z0.B - Z1.B }, { Z0.B - Z1.B }, Z0.Q */
478
+ asm volatile (".inst 0x4522ec00" : : : "z0" );
479
+ }
480
+
373
481
static void sveb16b16_sigill (void )
374
482
{
375
483
/* BFADD Z0.H, Z0.H, Z0.H */
376
484
asm volatile (".inst 0x65000000" : : : );
377
485
}
378
486
487
+ static void svebfscale_sigill (void )
488
+ {
489
+ /* BFSCALE Z0.H, P0/M, Z0.H, Z0.H */
490
+ asm volatile (".inst 0x65098000" : : : "z0" );
491
+ }
492
+
493
+ static void svef16mm_sigill (void )
494
+ {
495
+ /* FMMLA Z0.S, Z0.H, Z0.H */
496
+ asm volatile (".inst 0x6420e400" );
497
+ }
498
+
379
499
static void svepmull_sigill (void )
380
500
{
381
501
/* PMULLB Z0.Q, Z0.D, Z0.D */
@@ -394,6 +514,12 @@ static void svesha3_sigill(void)
394
514
asm volatile (".inst 0x4203800" : : : "z0" );
395
515
}
396
516
517
+ static void sveeltperm_sigill (void )
518
+ {
519
+ /* COMPACT Z0.B, P0, Z0.B */
520
+ asm volatile (".inst 0x5218000" : : : "x0" );
521
+ }
522
+
397
523
static void svesm4_sigill (void )
398
524
{
399
525
/* SM4E Z0.S, Z0.S, Z0.S */
@@ -469,6 +595,13 @@ static const struct hwcap_data {
469
595
.cpuinfo = "aes" ,
470
596
.sigill_fn = aes_sigill ,
471
597
},
598
+ {
599
+ .name = "CMPBR" ,
600
+ .at_hwcap = AT_HWCAP ,
601
+ .hwcap_bit = HWCAP_CMPBR ,
602
+ .cpuinfo = "cmpbr" ,
603
+ .sigill_fn = cmpbr_sigill ,
604
+ },
472
605
{
473
606
.name = "CRC32" ,
474
607
.at_hwcap = AT_HWCAP ,
@@ -523,6 +656,20 @@ static const struct hwcap_data {
523
656
.cpuinfo = "f8fma" ,
524
657
.sigill_fn = f8fma_sigill ,
525
658
},
659
+ {
660
+ .name = "F8MM8" ,
661
+ .at_hwcap = AT_HWCAP ,
662
+ .hwcap_bit = HWCAP_F8MM8 ,
663
+ .cpuinfo = "f8mm8" ,
664
+ .sigill_fn = f8mm8_sigill ,
665
+ },
666
+ {
667
+ .name = "F8MM4" ,
668
+ .at_hwcap = AT_HWCAP ,
669
+ .hwcap_bit = HWCAP_F8MM4 ,
670
+ .cpuinfo = "f8mm4" ,
671
+ .sigill_fn = f8mm4_sigill ,
672
+ },
526
673
{
527
674
.name = "FAMINMAX" ,
528
675
.at_hwcap = AT_HWCAP2 ,
@@ -545,6 +692,13 @@ static const struct hwcap_data {
545
692
.sigill_fn = fpmr_sigill ,
546
693
.sigill_reliable = true,
547
694
},
695
+ {
696
+ .name = "FPRCVT" ,
697
+ .at_hwcap = AT_HWCAP ,
698
+ .hwcap_bit = HWCAP_FPRCVT ,
699
+ .cpuinfo = "fprcvt" ,
700
+ .sigill_fn = fprcvt_sigill ,
701
+ },
548
702
{
549
703
.name = "GCS" ,
550
704
.at_hwcap = AT_HWCAP ,
@@ -691,6 +845,20 @@ static const struct hwcap_data {
691
845
.cpuinfo = "sme2p1" ,
692
846
.sigill_fn = sme2p1_sigill ,
693
847
},
848
+ {
849
+ .name = "SME 2.2" ,
850
+ .at_hwcap = AT_HWCAP ,
851
+ .hwcap_bit = HWCAP_SME2P2 ,
852
+ .cpuinfo = "sme2p2" ,
853
+ .sigill_fn = sme2p2_sigill ,
854
+ },
855
+ {
856
+ .name = "SME AES" ,
857
+ .at_hwcap = AT_HWCAP ,
858
+ .hwcap_bit = HWCAP_SME_AES ,
859
+ .cpuinfo = "smeaes" ,
860
+ .sigill_fn = sme_aes_sigill ,
861
+ },
694
862
{
695
863
.name = "SME I16I32" ,
696
864
.at_hwcap = AT_HWCAP2 ,
@@ -740,6 +908,13 @@ static const struct hwcap_data {
740
908
.cpuinfo = "smelutv2" ,
741
909
.sigill_fn = smelutv2_sigill ,
742
910
},
911
+ {
912
+ .name = "SME SBITPERM" ,
913
+ .at_hwcap = AT_HWCAP ,
914
+ .hwcap_bit = HWCAP_SME_SBITPERM ,
915
+ .cpuinfo = "smesbitperm" ,
916
+ .sigill_fn = sme_sbitperm_sigill ,
917
+ },
743
918
{
744
919
.name = "SME SF8FMA" ,
745
920
.at_hwcap = AT_HWCAP2 ,
@@ -761,6 +936,27 @@ static const struct hwcap_data {
761
936
.cpuinfo = "smesf8dp4" ,
762
937
.sigill_fn = smesf8dp4_sigill ,
763
938
},
939
+ {
940
+ .name = "SME SFEXPA" ,
941
+ .at_hwcap = AT_HWCAP ,
942
+ .hwcap_bit = HWCAP_SME_SFEXPA ,
943
+ .cpuinfo = "smesfexpa" ,
944
+ .sigill_fn = smesfexpa_sigill ,
945
+ },
946
+ {
947
+ .name = "SME SMOP4" ,
948
+ .at_hwcap = AT_HWCAP ,
949
+ .hwcap_bit = HWCAP_SME_SMOP4 ,
950
+ .cpuinfo = "smesmop4" ,
951
+ .sigill_fn = smesmop4_sigill ,
952
+ },
953
+ {
954
+ .name = "SME STMOP" ,
955
+ .at_hwcap = AT_HWCAP ,
956
+ .hwcap_bit = HWCAP_SME_STMOP ,
957
+ .cpuinfo = "smestmop" ,
958
+ .sigill_fn = smestmop_sigill ,
959
+ },
764
960
{
765
961
.name = "SVE" ,
766
962
.at_hwcap = AT_HWCAP ,
@@ -783,13 +979,48 @@ static const struct hwcap_data {
783
979
.cpuinfo = "sve2p1" ,
784
980
.sigill_fn = sve2p1_sigill ,
785
981
},
982
+ {
983
+ .name = "SVE 2.2" ,
984
+ .at_hwcap = AT_HWCAP ,
985
+ .hwcap_bit = HWCAP_SVE2P2 ,
986
+ .cpuinfo = "sve2p2" ,
987
+ .sigill_fn = sve2p2_sigill ,
988
+ },
786
989
{
787
990
.name = "SVE AES" ,
788
991
.at_hwcap = AT_HWCAP2 ,
789
992
.hwcap_bit = HWCAP2_SVEAES ,
790
993
.cpuinfo = "sveaes" ,
791
994
.sigill_fn = sveaes_sigill ,
792
995
},
996
+ {
997
+ .name = "SVE AES2" ,
998
+ .at_hwcap = AT_HWCAP ,
999
+ .hwcap_bit = HWCAP_SVE_AES2 ,
1000
+ .cpuinfo = "sveaes2" ,
1001
+ .sigill_fn = sveaes2_sigill ,
1002
+ },
1003
+ {
1004
+ .name = "SVE BFSCALE" ,
1005
+ .at_hwcap = AT_HWCAP ,
1006
+ .hwcap_bit = HWCAP_SVE_BFSCALE ,
1007
+ .cpuinfo = "svebfscale" ,
1008
+ .sigill_fn = svebfscale_sigill ,
1009
+ },
1010
+ {
1011
+ .name = "SVE ELTPERM" ,
1012
+ .at_hwcap = AT_HWCAP ,
1013
+ .hwcap_bit = HWCAP_SVE_ELTPERM ,
1014
+ .cpuinfo = "sveeltperm" ,
1015
+ .sigill_fn = sveeltperm_sigill ,
1016
+ },
1017
+ {
1018
+ .name = "SVE F16MM" ,
1019
+ .at_hwcap = AT_HWCAP ,
1020
+ .hwcap_bit = HWCAP_SVE_F16MM ,
1021
+ .cpuinfo = "svef16mm" ,
1022
+ .sigill_fn = svef16mm_sigill ,
1023
+ },
793
1024
{
794
1025
.name = "SVE2 B16B16" ,
795
1026
.at_hwcap = AT_HWCAP2 ,
0 commit comments