utility.cc (13363:15eae7ca2bfd) | utility.cc (13364:055bf0fa0f02) |
---|---|
1/* 2 * Copyright (c) 2009-2014, 2016-2018 ARM Limited 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 612 unchanged lines hidden (view full) --- 621 break; 622 } 623 } 624 } 625 return trapToHype; 626} 627 628bool | 1/* 2 * Copyright (c) 2009-2014, 2016-2018 ARM Limited 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 612 unchanged lines hidden (view full) --- 621 break; 622 } 623 } 624 } 625 return trapToHype; 626} 627 628bool |
629msrMrs64TrapToSup(const MiscRegIndex miscReg, ExceptionLevel el, 630 CPACR cpacr /* CPACR_EL1 */) 631{ 632 bool trapToSup = false; 633 switch (miscReg) { 634 case MISCREG_FPCR: 635 case MISCREG_FPSR: 636 case MISCREG_FPEXC32_EL2: 637 if ((el == EL0 && cpacr.fpen != 0x3) || 638 (el == EL1 && !(cpacr.fpen & 0x1))) 639 trapToSup = true; 640 break; 641 default: 642 break; 643 } 644 return trapToSup; 645} 646 647bool 648msrMrs64TrapToHyp(const MiscRegIndex miscReg, 649 ExceptionLevel el, 650 bool isRead, 651 CPTR cptr /* CPTR_EL2 */, 652 HCR hcr /* HCR_EL2 */, 653 SCR scr, 654 CPSR cpsr, 655 bool * isVfpNeon) 656{ 657 bool trapToHyp = false; 658 *isVfpNeon = false; 659 660 if (!inSecureState(scr, cpsr) && (el != EL2)) { 661 switch (miscReg) { 662 // FP/SIMD regs 663 case MISCREG_FPCR: 664 case MISCREG_FPSR: 665 case MISCREG_FPEXC32_EL2: 666 trapToHyp = cptr.tfp; 667 *isVfpNeon = true; 668 break; 669 // CPACR 670 case MISCREG_CPACR_EL1: 671 trapToHyp = cptr.tcpac && el == EL1; 672 break; 673 // Virtual memory control regs 674 case MISCREG_SCTLR_EL1: 675 case MISCREG_TTBR0_EL1: 676 case MISCREG_TTBR1_EL1: 677 case MISCREG_TCR_EL1: 678 case MISCREG_ESR_EL1: 679 case MISCREG_FAR_EL1: 680 case MISCREG_AFSR0_EL1: 681 case MISCREG_AFSR1_EL1: 682 case MISCREG_MAIR_EL1: 683 case MISCREG_AMAIR_EL1: 684 case MISCREG_CONTEXTIDR_EL1: 685 trapToHyp = ((hcr.trvm && isRead) || (hcr.tvm && !isRead)) 686 && el == EL1; 687 break; 688 // TLB maintenance instructions 689 case MISCREG_TLBI_VMALLE1: 690 case MISCREG_TLBI_VAE1_Xt: 691 case MISCREG_TLBI_ASIDE1_Xt: 692 case MISCREG_TLBI_VAAE1_Xt: 693 case MISCREG_TLBI_VALE1_Xt: 694 case MISCREG_TLBI_VAALE1_Xt: 695 case MISCREG_TLBI_VMALLE1IS: 696 case MISCREG_TLBI_VAE1IS_Xt: 697 case MISCREG_TLBI_ASIDE1IS_Xt: 698 case MISCREG_TLBI_VAAE1IS_Xt: 699 case MISCREG_TLBI_VALE1IS_Xt: 700 case MISCREG_TLBI_VAALE1IS_Xt: 701 trapToHyp = hcr.ttlb && el == EL1; 702 break; 703 // Cache maintenance instructions to the point of unification 704 case MISCREG_IC_IVAU_Xt: 705 case MISCREG_ICIALLU: 706 case MISCREG_ICIALLUIS: 707 case MISCREG_DC_CVAU_Xt: 708 trapToHyp = hcr.tpu && el <= EL1; 709 break; 710 // Data/Unified cache maintenance instructions to the 711 // point of coherency 712 case MISCREG_DC_IVAC_Xt: 713 case MISCREG_DC_CIVAC_Xt: 714 case MISCREG_DC_CVAC_Xt: 715 trapToHyp = hcr.tpc && el <= EL1; 716 break; 717 // Data/Unified cache maintenance instructions by set/way 718 case MISCREG_DC_ISW_Xt: 719 case MISCREG_DC_CSW_Xt: 720 case MISCREG_DC_CISW_Xt: 721 trapToHyp = hcr.tsw && el == EL1; 722 break; 723 // ACTLR 724 case MISCREG_ACTLR_EL1: 725 trapToHyp = hcr.tacr && el == EL1; 726 break; 727 728 // @todo: Trap implementation-dependent functionality based on 729 // hcr.tidcp 730 731 // ID regs, group 3 732 case MISCREG_ID_PFR0_EL1: 733 case MISCREG_ID_PFR1_EL1: 734 case MISCREG_ID_DFR0_EL1: 735 case MISCREG_ID_AFR0_EL1: 736 case MISCREG_ID_MMFR0_EL1: 737 case MISCREG_ID_MMFR1_EL1: 738 case MISCREG_ID_MMFR2_EL1: 739 case MISCREG_ID_MMFR3_EL1: 740 case MISCREG_ID_ISAR0_EL1: 741 case MISCREG_ID_ISAR1_EL1: 742 case MISCREG_ID_ISAR2_EL1: 743 case MISCREG_ID_ISAR3_EL1: 744 case MISCREG_ID_ISAR4_EL1: 745 case MISCREG_ID_ISAR5_EL1: 746 case MISCREG_MVFR0_EL1: 747 case MISCREG_MVFR1_EL1: 748 case MISCREG_MVFR2_EL1: 749 case MISCREG_ID_AA64PFR0_EL1: 750 case MISCREG_ID_AA64PFR1_EL1: 751 case MISCREG_ID_AA64DFR0_EL1: 752 case MISCREG_ID_AA64DFR1_EL1: 753 case MISCREG_ID_AA64ISAR0_EL1: 754 case MISCREG_ID_AA64ISAR1_EL1: 755 case MISCREG_ID_AA64MMFR0_EL1: 756 case MISCREG_ID_AA64MMFR1_EL1: 757 case MISCREG_ID_AA64MMFR2_EL1: 758 case MISCREG_ID_AA64AFR0_EL1: 759 case MISCREG_ID_AA64AFR1_EL1: 760 assert(isRead); 761 trapToHyp = hcr.tid3 && el == EL1; 762 break; 763 // ID regs, group 2 764 case MISCREG_CTR_EL0: 765 case MISCREG_CCSIDR_EL1: 766 case MISCREG_CLIDR_EL1: 767 case MISCREG_CSSELR_EL1: 768 trapToHyp = hcr.tid2 && el <= EL1; 769 break; 770 // ID regs, group 1 771 case MISCREG_AIDR_EL1: 772 case MISCREG_REVIDR_EL1: 773 assert(isRead); 774 trapToHyp = hcr.tid1 && el == EL1; 775 break; 776 default: 777 break; 778 } 779 } 780 return trapToHyp; 781} 782 783bool 784msrMrs64TrapToMon(const MiscRegIndex miscReg, CPTR cptr /* CPTR_EL3 */, 785 ExceptionLevel el, bool * isVfpNeon) 786{ 787 bool trapToMon = false; 788 *isVfpNeon = false; 789 790 switch (miscReg) { 791 // FP/SIMD regs 792 case MISCREG_FPCR: 793 case MISCREG_FPSR: 794 case MISCREG_FPEXC32_EL2: 795 trapToMon = cptr.tfp; 796 *isVfpNeon = true; 797 break; 798 // CPACR, CPTR 799 case MISCREG_CPACR_EL1: 800 if (el == EL1 || el == EL2) { 801 trapToMon = cptr.tcpac; 802 } 803 break; 804 case MISCREG_CPTR_EL2: 805 if (el == EL2) { 806 trapToMon = cptr.tcpac; 807 } 808 break; 809 default: 810 break; 811 } 812 return trapToMon; 813} 814 815bool | |
816decodeMrsMsrBankedReg(uint8_t sysM, bool r, bool &isIntReg, int ®Idx, 817 CPSR cpsr, SCR scr, NSACR nsacr, bool checkSecurity) 818{ 819 OperatingMode mode = MODE_UNDEFINED; 820 bool ok = true; 821 822 // R mostly indicates if its a int register or a misc reg, we override 823 // below if the few corner cases --- 173 unchanged lines hidden --- | 629decodeMrsMsrBankedReg(uint8_t sysM, bool r, bool &isIntReg, int ®Idx, 630 CPSR cpsr, SCR scr, NSACR nsacr, bool checkSecurity) 631{ 632 OperatingMode mode = MODE_UNDEFINED; 633 bool ok = true; 634 635 // R mostly indicates if its a int register or a misc reg, we override 636 // below if the few corner cases --- 173 unchanged lines hidden --- |