cpu-features.h (1036ce4e) | cpu-features.h (5a534314) |
---|---|
1/* 2 * QEMU Arm CPU -- feature test functions 3 * 4 * Copyright (c) 2023 Linaro Ltd 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either --- 437 unchanged lines hidden (view full) --- 446 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TS) >= 2; 447} 448 449static inline bool isar_feature_aa64_rndr(const ARMISARegisters *id) 450{ 451 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, RNDR) != 0; 452} 453 | 1/* 2 * QEMU Arm CPU -- feature test functions 3 * 4 * Copyright (c) 2023 Linaro Ltd 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either --- 437 unchanged lines hidden (view full) --- 446 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TS) >= 2; 447} 448 449static inline bool isar_feature_aa64_rndr(const ARMISARegisters *id) 450{ 451 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, RNDR) != 0; 452} 453 |
454static inline bool isar_feature_aa64_tlbirange(const ARMISARegisters *id) 455{ 456 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TLB) == 2; 457} 458 459static inline bool isar_feature_aa64_tlbios(const ARMISARegisters *id) 460{ 461 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TLB) != 0; 462} 463 | |
464static inline bool isar_feature_aa64_jscvt(const ARMISARegisters *id) 465{ 466 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, JSCVT) != 0; 467} 468 469static inline bool isar_feature_aa64_fcma(const ARMISARegisters *id) 470{ 471 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, FCMA) != 0; --- 47 unchanged lines hidden (view full) --- 519{ 520 /* 521 * Return true if pauth is enabled with the architected QARMA3 algorithm. 522 * QEMU will always enable or disable both APA3 and GPA3. 523 */ 524 return FIELD_EX64(id->id_aa64isar2, ID_AA64ISAR2, APA3) != 0; 525} 526 | 454static inline bool isar_feature_aa64_jscvt(const ARMISARegisters *id) 455{ 456 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, JSCVT) != 0; 457} 458 459static inline bool isar_feature_aa64_fcma(const ARMISARegisters *id) 460{ 461 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, FCMA) != 0; --- 47 unchanged lines hidden (view full) --- 509{ 510 /* 511 * Return true if pauth is enabled with the architected QARMA3 algorithm. 512 * QEMU will always enable or disable both APA3 and GPA3. 513 */ 514 return FIELD_EX64(id->id_aa64isar2, ID_AA64ISAR2, APA3) != 0; 515} 516 |
517static inline bool isar_feature_aa64_tlbirange(const ARMISARegisters *id) 518{ 519 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TLB) == 2; 520} 521 522static inline bool isar_feature_aa64_tlbios(const ARMISARegisters *id) 523{ 524 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TLB) != 0; 525} 526 |
|
527static inline bool isar_feature_aa64_sb(const ARMISARegisters *id) 528{ 529 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, SB) != 0; 530} 531 532static inline bool isar_feature_aa64_predinv(const ARMISARegisters *id) 533{ 534 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, SPECRES) != 0; --- 14 unchanged lines hidden (view full) --- 549 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, DPB) >= 2; 550} 551 552static inline bool isar_feature_aa64_bf16(const ARMISARegisters *id) 553{ 554 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, BF16) != 0; 555} 556 | 527static inline bool isar_feature_aa64_sb(const ARMISARegisters *id) 528{ 529 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, SB) != 0; 530} 531 532static inline bool isar_feature_aa64_predinv(const ARMISARegisters *id) 533{ 534 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, SPECRES) != 0; --- 14 unchanged lines hidden (view full) --- 549 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, DPB) >= 2; 550} 551 552static inline bool isar_feature_aa64_bf16(const ARMISARegisters *id) 553{ 554 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, BF16) != 0; 555} 556 |
557static inline bool isar_feature_aa64_rcpc_8_3(const ARMISARegisters *id) 558{ 559 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) != 0; 560} 561 562static inline bool isar_feature_aa64_rcpc_8_4(const ARMISARegisters *id) 563{ 564 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) >= 2; 565} 566 567static inline bool isar_feature_aa64_i8mm(const ARMISARegisters *id) 568{ 569 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, I8MM) != 0; 570} 571 572static inline bool isar_feature_aa64_hbc(const ARMISARegisters *id) 573{ 574 return FIELD_EX64(id->id_aa64isar2, ID_AA64ISAR2, BC) != 0; 575} 576 577static inline bool isar_feature_aa64_mops(const ARMISARegisters *id) 578{ 579 return FIELD_EX64(id->id_aa64isar2, ID_AA64ISAR2, MOPS); 580} 581 | |
582static inline bool isar_feature_aa64_fp_simd(const ARMISARegisters *id) 583{ 584 /* We always set the AdvSIMD and FP fields identically. */ 585 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, FP) != 0xf; 586} 587 588static inline bool isar_feature_aa64_fp16(const ARMISARegisters *id) 589{ --- 36 unchanged lines hidden (view full) --- 626 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, SEL2) != 0; 627} 628 629static inline bool isar_feature_aa64_rme(const ARMISARegisters *id) 630{ 631 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, RME) != 0; 632} 633 | 557static inline bool isar_feature_aa64_fp_simd(const ARMISARegisters *id) 558{ 559 /* We always set the AdvSIMD and FP fields identically. */ 560 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, FP) != 0xf; 561} 562 563static inline bool isar_feature_aa64_fp16(const ARMISARegisters *id) 564{ --- 36 unchanged lines hidden (view full) --- 601 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, SEL2) != 0; 602} 603 604static inline bool isar_feature_aa64_rme(const ARMISARegisters *id) 605{ 606 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, RME) != 0; 607} 608 |
634static inline bool isar_feature_aa64_dit(const ARMISARegisters *id) | 609static inline bool isar_feature_aa64_vh(const ARMISARegisters *id) |
635{ | 610{ |
636 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, DIT) != 0; | 611 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, VH) != 0; |
637} 638 | 612} 613 |
639static inline bool isar_feature_aa64_scxtnum(const ARMISARegisters *id) | 614static inline bool isar_feature_aa64_lor(const ARMISARegisters *id) |
640{ | 615{ |
641 int key = FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, CSV2); 642 if (key >= 2) { 643 return true; /* FEAT_CSV2_2 */ 644 } 645 if (key == 1) { 646 key = FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, CSV2_FRAC); 647 return key >= 2; /* FEAT_CSV2_1p2 */ 648 } 649 return false; | 616 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, LO) != 0; |
650} 651 | 617} 618 |
652static inline bool isar_feature_aa64_ssbs(const ARMISARegisters *id) | 619static inline bool isar_feature_aa64_pan(const ARMISARegisters *id) |
653{ | 620{ |
654 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, SSBS) != 0; | 621 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) != 0; |
655} 656 | 622} 623 |
657static inline bool isar_feature_aa64_bti(const ARMISARegisters *id) | 624static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id) |
658{ | 625{ |
659 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0; | 626 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2; |
660} 661 | 627} 628 |
662static inline bool isar_feature_aa64_mte_insn_reg(const ARMISARegisters *id) | 629static inline bool isar_feature_aa64_pan3(const ARMISARegisters *id) |
663{ | 630{ |
664 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, MTE) != 0; | 631 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 3; |
665} 666 | 632} 633 |
667static inline bool isar_feature_aa64_mte(const ARMISARegisters *id) | 634static inline bool isar_feature_aa64_hcx(const ARMISARegisters *id) |
668{ | 635{ |
669 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, MTE) >= 2; | 636 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, HCX) != 0; |
670} 671 | 637} 638 |
672static inline bool isar_feature_aa64_sme(const ARMISARegisters *id) | 639static inline bool isar_feature_aa64_tidcp1(const ARMISARegisters *id) |
673{ | 640{ |
674 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, SME) != 0; | 641 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR1, TIDCP1) != 0; |
675} 676 | 642} 643 |
677static inline bool isar_feature_aa64_tgran4_lpa2(const ARMISARegisters *id) | 644static inline bool isar_feature_aa64_uao(const ARMISARegisters *id) |
678{ | 645{ |
679 return FIELD_SEX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4) >= 1; | 646 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, UAO) != 0; |
680} 681 | 647} 648 |
682static inline bool isar_feature_aa64_tgran4_2_lpa2(const ARMISARegisters *id) | 649static inline bool isar_feature_aa64_st(const ARMISARegisters *id) |
683{ | 650{ |
684 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4_2); 685 return t >= 3 || (t == 0 && isar_feature_aa64_tgran4_lpa2(id)); | 651 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, ST) != 0; |
686} 687 | 652} 653 |
688static inline bool isar_feature_aa64_tgran16_lpa2(const ARMISARegisters *id) | 654static inline bool isar_feature_aa64_lse2(const ARMISARegisters *id) |
689{ | 655{ |
690 return FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16) >= 2; | 656 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, AT) != 0; |
691} 692 | 657} 658 |
693static inline bool isar_feature_aa64_tgran16_2_lpa2(const ARMISARegisters *id) | 659static inline bool isar_feature_aa64_fwb(const ARMISARegisters *id) |
694{ | 660{ |
695 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16_2); 696 return t >= 3 || (t == 0 && isar_feature_aa64_tgran16_lpa2(id)); | 661 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, FWB) != 0; |
697} 698 | 662} 663 |
699static inline bool isar_feature_aa64_tgran4(const ARMISARegisters *id) | 664static inline bool isar_feature_aa64_ids(const ARMISARegisters *id) |
700{ | 665{ |
701 return FIELD_SEX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4) >= 0; | 666 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, IDS) != 0; |
702} 703 | 667} 668 |
704static inline bool isar_feature_aa64_tgran16(const ARMISARegisters *id) | 669static inline bool isar_feature_aa64_half_evt(const ARMISARegisters *id) |
705{ | 670{ |
706 return FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16) >= 1; | 671 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, EVT) >= 1; |
707} 708 | 672} 673 |
709static inline bool isar_feature_aa64_tgran64(const ARMISARegisters *id) | 674static inline bool isar_feature_aa64_evt(const ARMISARegisters *id) |
710{ | 675{ |
711 return FIELD_SEX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN64) >= 0; | 676 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, EVT) >= 2; |
712} 713 | 677} 678 |
714static inline bool isar_feature_aa64_tgran4_2(const ARMISARegisters *id) | 679static inline bool isar_feature_aa64_bti(const ARMISARegisters *id) |
715{ | 680{ |
716 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4_2); 717 return t >= 2 || (t == 0 && isar_feature_aa64_tgran4(id)); | 681 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0; |
718} 719 | 682} 683 |
720static inline bool isar_feature_aa64_tgran16_2(const ARMISARegisters *id) | 684static inline bool isar_feature_aa64_mte_insn_reg(const ARMISARegisters *id) |
721{ | 685{ |
722 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16_2); 723 return t >= 2 || (t == 0 && isar_feature_aa64_tgran16(id)); | 686 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, MTE) != 0; |
724} 725 | 687} 688 |
726static inline bool isar_feature_aa64_tgran64_2(const ARMISARegisters *id) | 689static inline bool isar_feature_aa64_mte(const ARMISARegisters *id) |
727{ | 690{ |
728 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN64_2); 729 return t >= 2 || (t == 0 && isar_feature_aa64_tgran64(id)); | 691 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, MTE) >= 2; |
730} 731 | 692} 693 |
732static inline bool isar_feature_aa64_fgt(const ARMISARegisters *id) | 694static inline bool isar_feature_aa64_sme(const ARMISARegisters *id) |
733{ | 695{ |
734 return FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, FGT) != 0; | 696 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, SME) != 0; |
735} 736 | 697} 698 |
737static inline bool isar_feature_aa64_vh(const ARMISARegisters *id) | 699static inline bool isar_feature_aa64_pmuv3p1(const ARMISARegisters *id) |
738{ | 700{ |
739 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, VH) != 0; | 701 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 4 && 702 FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf; |
740} 741 | 703} 704 |
742static inline bool isar_feature_aa64_lor(const ARMISARegisters *id) | 705static inline bool isar_feature_aa64_pmuv3p4(const ARMISARegisters *id) |
743{ | 706{ |
744 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, LO) != 0; | 707 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 5 && 708 FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf; |
745} 746 | 709} 710 |
747static inline bool isar_feature_aa64_pan(const ARMISARegisters *id) | 711static inline bool isar_feature_aa64_pmuv3p5(const ARMISARegisters *id) |
748{ | 712{ |
749 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) != 0; | 713 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 6 && 714 FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf; |
750} 751 | 715} 716 |
752static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id) | 717static inline bool isar_feature_aa64_rcpc_8_3(const ARMISARegisters *id) |
753{ | 718{ |
754 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2; | 719 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) != 0; |
755} 756 | 720} 721 |
757static inline bool isar_feature_aa64_pan3(const ARMISARegisters *id) | 722static inline bool isar_feature_aa64_rcpc_8_4(const ARMISARegisters *id) |
758{ | 723{ |
759 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 3; | 724 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) >= 2; |
760} 761 | 725} 726 |
762static inline bool isar_feature_aa64_hcx(const ARMISARegisters *id) | 727static inline bool isar_feature_aa64_i8mm(const ARMISARegisters *id) |
763{ | 728{ |
764 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, HCX) != 0; | 729 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, I8MM) != 0; |
765} 766 | 730} 731 |
767static inline bool isar_feature_aa64_tidcp1(const ARMISARegisters *id) | 732static inline bool isar_feature_aa64_hbc(const ARMISARegisters *id) |
768{ | 733{ |
769 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR1, TIDCP1) != 0; | 734 return FIELD_EX64(id->id_aa64isar2, ID_AA64ISAR2, BC) != 0; |
770} 771 | 735} 736 |
772static inline bool isar_feature_aa64_hafs(const ARMISARegisters *id) | 737static inline bool isar_feature_aa64_tgran4_lpa2(const ARMISARegisters *id) |
773{ | 738{ |
774 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, HAFDBS) != 0; | 739 return FIELD_SEX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4) >= 1; |
775} 776 | 740} 741 |
777static inline bool isar_feature_aa64_hdbs(const ARMISARegisters *id) | 742static inline bool isar_feature_aa64_tgran4_2_lpa2(const ARMISARegisters *id) |
778{ | 743{ |
779 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, HAFDBS) >= 2; | 744 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4_2); 745 return t >= 3 || (t == 0 && isar_feature_aa64_tgran4_lpa2(id)); |
780} 781 | 746} 747 |
782static inline bool isar_feature_aa64_tts2uxn(const ARMISARegisters *id) | 748static inline bool isar_feature_aa64_tgran16_lpa2(const ARMISARegisters *id) |
783{ | 749{ |
784 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, XNX) != 0; | 750 return FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16) >= 2; |
785} 786 | 751} 752 |
787static inline bool isar_feature_aa64_uao(const ARMISARegisters *id) | 753static inline bool isar_feature_aa64_tgran16_2_lpa2(const ARMISARegisters *id) |
788{ | 754{ |
789 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, UAO) != 0; | 755 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16_2); 756 return t >= 3 || (t == 0 && isar_feature_aa64_tgran16_lpa2(id)); |
790} 791 | 757} 758 |
792static inline bool isar_feature_aa64_st(const ARMISARegisters *id) | 759static inline bool isar_feature_aa64_tgran4(const ARMISARegisters *id) |
793{ | 760{ |
794 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, ST) != 0; | 761 return FIELD_SEX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4) >= 0; |
795} 796 | 762} 763 |
797static inline bool isar_feature_aa64_lse2(const ARMISARegisters *id) | 764static inline bool isar_feature_aa64_tgran16(const ARMISARegisters *id) |
798{ | 765{ |
799 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, AT) != 0; | 766 return FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16) >= 1; |
800} 801 | 767} 768 |
802static inline bool isar_feature_aa64_fwb(const ARMISARegisters *id) | 769static inline bool isar_feature_aa64_tgran64(const ARMISARegisters *id) |
803{ | 770{ |
804 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, FWB) != 0; | 771 return FIELD_SEX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN64) >= 0; |
805} 806 | 772} 773 |
807static inline bool isar_feature_aa64_ids(const ARMISARegisters *id) | 774static inline bool isar_feature_aa64_tgran4_2(const ARMISARegisters *id) |
808{ | 775{ |
809 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, IDS) != 0; | 776 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4_2); 777 return t >= 2 || (t == 0 && isar_feature_aa64_tgran4(id)); |
810} 811 | 778} 779 |
812static inline bool isar_feature_aa64_half_evt(const ARMISARegisters *id) | 780static inline bool isar_feature_aa64_tgran16_2(const ARMISARegisters *id) |
813{ | 781{ |
814 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, EVT) >= 1; | 782 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16_2); 783 return t >= 2 || (t == 0 && isar_feature_aa64_tgran16(id)); |
815} 816 | 784} 785 |
817static inline bool isar_feature_aa64_evt(const ARMISARegisters *id) | 786static inline bool isar_feature_aa64_tgran64_2(const ARMISARegisters *id) |
818{ | 787{ |
819 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, EVT) >= 2; | 788 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN64_2); 789 return t >= 2 || (t == 0 && isar_feature_aa64_tgran64(id)); |
820} 821 | 790} 791 |
792static inline bool isar_feature_aa64_fgt(const ARMISARegisters *id) 793{ 794 return FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, FGT) != 0; 795} 796 |
|
822static inline bool isar_feature_aa64_ccidx(const ARMISARegisters *id) 823{ 824 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, CCIDX) != 0; 825} 826 827static inline bool isar_feature_aa64_lva(const ARMISARegisters *id) 828{ 829 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, VARANGE) != 0; 830} 831 832static inline bool isar_feature_aa64_e0pd(const ARMISARegisters *id) 833{ 834 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, E0PD) != 0; 835} 836 | 797static inline bool isar_feature_aa64_ccidx(const ARMISARegisters *id) 798{ 799 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, CCIDX) != 0; 800} 801 802static inline bool isar_feature_aa64_lva(const ARMISARegisters *id) 803{ 804 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, VARANGE) != 0; 805} 806 807static inline bool isar_feature_aa64_e0pd(const ARMISARegisters *id) 808{ 809 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, E0PD) != 0; 810} 811 |
837static inline bool isar_feature_aa64_pmuv3p1(const ARMISARegisters *id) | 812static inline bool isar_feature_aa64_hafs(const ARMISARegisters *id) |
838{ | 813{ |
839 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 4 && 840 FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf; | 814 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, HAFDBS) != 0; |
841} 842 | 815} 816 |
843static inline bool isar_feature_aa64_pmuv3p4(const ARMISARegisters *id) | 817static inline bool isar_feature_aa64_hdbs(const ARMISARegisters *id) |
844{ | 818{ |
845 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 5 && 846 FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf; | 819 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, HAFDBS) >= 2; |
847} 848 | 820} 821 |
849static inline bool isar_feature_aa64_pmuv3p5(const ARMISARegisters *id) | 822static inline bool isar_feature_aa64_tts2uxn(const ARMISARegisters *id) |
850{ | 823{ |
851 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 6 && 852 FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf; | 824 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, XNX) != 0; |
853} 854 | 825} 826 |
855static inline bool isar_feature_aa64_debugv8p2(const ARMISARegisters *id) | 827static inline bool isar_feature_aa64_dit(const ARMISARegisters *id) |
856{ | 828{ |
857 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, DEBUGVER) >= 8; | 829 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, DIT) != 0; |
858} 859 | 830} 831 |
860static inline bool isar_feature_aa64_doublelock(const ARMISARegisters *id) | 832static inline bool isar_feature_aa64_scxtnum(const ARMISARegisters *id) |
861{ | 833{ |
862 return FIELD_SEX64(id->id_aa64dfr0, ID_AA64DFR0, DOUBLELOCK) >= 0; | 834 int key = FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, CSV2); 835 if (key >= 2) { 836 return true; /* FEAT_CSV2_2 */ 837 } 838 if (key == 1) { 839 key = FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, CSV2_FRAC); 840 return key >= 2; /* FEAT_CSV2_1p2 */ 841 } 842 return false; |
863} 864 | 843} 844 |
845static inline bool isar_feature_aa64_ssbs(const ARMISARegisters *id) 846{ 847 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, SSBS) != 0; 848} 849 850static inline bool isar_feature_aa64_debugv8p2(const ARMISARegisters *id) 851{ 852 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, DEBUGVER) >= 8; 853} 854 |
|
865static inline bool isar_feature_aa64_sve2(const ARMISARegisters *id) 866{ 867 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, SVEVER) != 0; 868} 869 870static inline bool isar_feature_aa64_sve2_aes(const ARMISARegisters *id) 871{ 872 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, AES) != 0; --- 49 unchanged lines hidden (view full) --- 922 return FIELD_EX64(id->id_aa64smfr0, ID_AA64SMFR0, I16I64) == 0xf; 923} 924 925static inline bool isar_feature_aa64_sme_fa64(const ARMISARegisters *id) 926{ 927 return FIELD_EX64(id->id_aa64smfr0, ID_AA64SMFR0, FA64); 928} 929 | 855static inline bool isar_feature_aa64_sve2(const ARMISARegisters *id) 856{ 857 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, SVEVER) != 0; 858} 859 860static inline bool isar_feature_aa64_sve2_aes(const ARMISARegisters *id) 861{ 862 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, AES) != 0; --- 49 unchanged lines hidden (view full) --- 912 return FIELD_EX64(id->id_aa64smfr0, ID_AA64SMFR0, I16I64) == 0xf; 913} 914 915static inline bool isar_feature_aa64_sme_fa64(const ARMISARegisters *id) 916{ 917 return FIELD_EX64(id->id_aa64smfr0, ID_AA64SMFR0, FA64); 918} 919 |
920static inline bool isar_feature_aa64_doublelock(const ARMISARegisters *id) 921{ 922 return FIELD_SEX64(id->id_aa64dfr0, ID_AA64DFR0, DOUBLELOCK) >= 0; 923} 924 925static inline bool isar_feature_aa64_mops(const ARMISARegisters *id) 926{ 927 return FIELD_EX64(id->id_aa64isar2, ID_AA64ISAR2, MOPS); 928} 929 |
|
930/* 931 * Feature tests for "does this exist in either 32-bit or 64-bit?" 932 */ 933static inline bool isar_feature_any_fp16(const ARMISARegisters *id) 934{ 935 return isar_feature_aa64_fp16(id) || isar_feature_aa32_fp16_arith(id); 936} 937 --- 57 unchanged lines hidden --- | 930/* 931 * Feature tests for "does this exist in either 32-bit or 64-bit?" 932 */ 933static inline bool isar_feature_any_fp16(const ARMISARegisters *id) 934{ 935 return isar_feature_aa64_fp16(id) || isar_feature_aa32_fp16_arith(id); 936} 937 --- 57 unchanged lines hidden --- |