56 std::unordered_map<MiscRegNum32, MiscRegIndex> miscRegNum32ToIdx{
520 auto it = miscRegNum32ToIdx.find(cop_reg);
521 if (it != miscRegNum32ToIdx.end()) {
524 warn(
"CP14 unimplemented crn[%d], opc1[%d], crm[%d], opc2[%d]",
525 crn, opc1, crm,
opc2);
534 auto it = miscRegNum32ToIdx.find(cop_reg);
535 if (it != miscRegNum32ToIdx.end()) {
539 (crn == 9 && (crm <= 2 || crm >= 5)) ||
540 (crn == 10 && opc1 == 0 && crm <= 1) ||
541 (crn == 11 && opc1 <= 7 && (crm <= 8 || crm ==15))) {
553 auto it = miscRegNum32ToIdx.find(cop_reg);
554 if (it != miscRegNum32ToIdx.end()) {
561 std::tuple<bool, bool>
564 bool secure = !scr.ns;
565 bool canRead =
false;
566 bool undefined =
false;
604 return std::make_tuple(canRead, undefined);
607 std::tuple<bool, bool>
610 bool secure = !scr.ns;
611 bool canWrite =
false;
612 bool undefined =
false;
650 return std::make_tuple(canWrite, undefined);
659 if (trap_cond && (!
EL2Enabled(tc) || !hcr.tge))
675 int reg_as_int =
static_cast<int>(
reg);
688 return isa->snsBankedIndex64(
reg, scr.ns);
734 if (highest_el ==
EL2 || highest_el ==
EL3)
739 if (highest_el ==
EL3)
766 panic(
"Invalid exception level");
802 panic(
"Invalid exception level");
812 std::unordered_map<MiscRegIndex, MiscRegNum64> idxToMiscRegNum;
816 std::unordered_map<MiscRegNum64, MiscRegIndex> miscRegNumToIdx{
1296 unsigned crn,
unsigned crm,
1300 auto it = miscRegNumToIdx.find(sys_reg);
1301 if (it != miscRegNumToIdx.end()) {
1305 if ((op0 == 1 || op0 == 3) && (crn == 11 || crn == 15)) {
1316 if (
auto it = idxToMiscRegNum.find(misc_reg);
1317 it != idxToMiscRegNum.end()) {
1320 panic(
"Invalid MiscRegIndex: %n\n", misc_reg);
1329 static bool completed =
false;
1347 bool LSMAOE =
false;
1350 bool nTLSMD =
false;
1358 const bool vhe_implemented =
release->
has(ArmExtension::FEAT_VHE);
1359 const bool sel2_implemented =
release->
has(ArmExtension::FEAT_SEL2);
1422 .privSecure(!aarch32EL3)
1432 .privSecure(!aarch32EL3)
1606 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
1654 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
1663 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
1666 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
1669 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
1698 .allPrivileges().exceptUserMode().writes(0);
1741 .privSecure(!aarch32EL3)
1742 .nonSecure().exceptUserMode();
1745 .secure().exceptUserMode();
1747 .
hyp().monNonSecure();
1749 .
hyp().monNonSecure();
1755 .res1(0x00400800 | (SPAN ? 0 : 0x800000)
1756 | (LSMAOE ? 0 : 0x10)
1757 | (nTLSMD ? 0 : 0x8));
1760 .privSecure(!aarch32EL3)
1761 .nonSecure().exceptUserMode();
1764 .secure().exceptUserMode();
1769 .privSecure(!aarch32EL3)
1770 .nonSecure().exceptUserMode();
1773 .secure().exceptUserMode();
1779 .
mon().secure().exceptUserMode()
1785 .
allPrivileges().hypWrite(0).privNonSecureWrite(0).exceptUserMode();
1787 .
hyp().monNonSecure()
1788 .res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
1789 | (IESB ? 0 : 0x200000)
1790 | (EnDA ? 0 : 0x8000000)
1791 | (EnIB ? 0 : 0x40000000)
1792 | (EnIA ? 0 : 0x80000000))
1795 .
hyp().monNonSecure();
1797 .
hyp().monNonSecure()
1800 .
hyp().monNonSecure()
1803 .
hyp().monNonSecure();
1805 .
hyp().monNonSecure();
1807 .
hyp().monNonSecure();
1811 .hyp().monNonSecure();
1816 .privSecure(!aarch32EL3)
1817 .nonSecure().exceptUserMode();
1820 .secure().exceptUserMode();
1825 .privSecure(!aarch32EL3)
1826 .nonSecure().exceptUserMode();
1829 .secure().exceptUserMode();
1834 .privSecure(!aarch32EL3)
1835 .nonSecure().exceptUserMode();
1838 .secure().exceptUserMode();
1840 .
hyp().monNonSecure();
1842 .
hyp().monNonSecure();
1847 .privSecure(!aarch32EL3)
1848 .nonSecure().exceptUserMode();
1851 .secure().exceptUserMode();
1856 .privSecure(!aarch32EL3)
1857 .nonSecure().exceptUserMode();
1860 .secure().exceptUserMode();
1865 .privSecure(!aarch32EL3)
1866 .nonSecure().exceptUserMode();
1869 .secure().exceptUserMode();
1878 .privSecure(!aarch32EL3)
1879 .nonSecure().exceptUserMode();
1884 .secure().exceptUserMode();
1893 .privSecure(!aarch32EL3)
1894 .nonSecure().exceptUserMode();
1899 .secure().exceptUserMode();
1901 .
hyp().monNonSecure();
1903 .
hyp().monNonSecure();
1905 .
hyp().monNonSecure();
1910 .privSecure(!aarch32EL3)
1911 .nonSecure().exceptUserMode();
1914 .secure().exceptUserMode();
1919 .privSecure(!aarch32EL3)
1920 .nonSecure().exceptUserMode();
1923 .secure().exceptUserMode();
1925 .
hyp().monNonSecure();
1927 .
hyp().monNonSecure();
1929 .
hyp().monNonSecure();
1933 .writes(1).exceptUserMode();
1937 .writes(1).exceptUserMode();
1942 .privSecure(!aarch32EL3)
1943 .nonSecure().exceptUserMode();
1946 .secure().exceptUserMode();
1948 .
writes(1).exceptUserMode();
1952 .writes(1).exceptUserMode();
1958 .writes(1).exceptUserMode();
1962 .writes(1).exceptUserMode();
1966 .writes(1).exceptUserMode();
1970 .writes(1).exceptUserMode();
1972 .
writes(1).exceptUserMode();
1974 .
writes(1).exceptUserMode();
1976 .
writes(1).exceptUserMode();
1978 .
writes(1).exceptUserMode();
1988 .
writes(1).exceptUserMode();
1992 .writes(1).exceptUserMode();
2000 .writes(1).exceptUserMode();
2004 .writes(1).exceptUserMode();
2008 .writes(1).exceptUserMode();
2014 .
writes(1).exceptUserMode();
2016 .
writes(1).exceptUserMode();
2018 .
writes(1).exceptUserMode();
2020 .
writes(1).exceptUserMode();
2022 .
writes(1).exceptUserMode();
2024 .
writes(1).exceptUserMode();
2026 .
writes(1).exceptUserMode();
2028 .
writes(1).exceptUserMode();
2030 .
writes(1).exceptUserMode();
2032 .
writes(1).exceptUserMode();
2034 .
writes(1).exceptUserMode();
2036 .
writes(1).exceptUserMode();
2038 .
writes(1).exceptUserMode();
2040 .
writes(1).exceptUserMode();
2042 .
writes(1).exceptUserMode();
2044 .
writes(1).exceptUserMode();
2046 .
writes(1).exceptUserMode();
2048 .
writes(1).exceptUserMode();
2110 .allPrivileges().exceptUserMode();
2115 .privSecure(!aarch32EL3)
2116 .nonSecure().exceptUserMode();
2119 .secure().exceptUserMode();
2124 .privSecure(!aarch32EL3)
2125 .nonSecure().exceptUserMode();
2128 .secure().exceptUserMode();
2133 .privSecure(!aarch32EL3)
2134 .nonSecure().exceptUserMode();
2137 .secure().exceptUserMode();
2142 .privSecure(!aarch32EL3)
2143 .nonSecure().exceptUserMode();
2146 .secure().exceptUserMode();
2151 .privSecure(!aarch32EL3)
2152 .nonSecure().exceptUserMode();
2155 .secure().exceptUserMode();
2160 .privSecure(!aarch32EL3)
2161 .nonSecure().exceptUserMode();
2164 .secure().exceptUserMode();
2166 .
hyp().monNonSecure();
2168 .
hyp().monNonSecure();
2172 .hyp().monNonSecure();
2176 .hyp().monNonSecure();
2181 .privSecure(!aarch32EL3)
2182 .nonSecure().exceptUserMode();
2185 .secure().exceptUserMode();
2193 .mon().secure().exceptUserMode();
2197 .
hyp().monNonSecure()
2202 .allPrivileges().exceptUserMode();
2207 .privSecure(!aarch32EL3)
2208 .nonSecure().exceptUserMode();
2211 .secure().exceptUserMode();
2217 .privSecure(!aarch32EL3)
2227 .userNonSecureWrite(0).userSecureRead(1)
2228 .privSecure(!aarch32EL3)
2232 .secure().userSecureWrite(0);
2237 .nonSecure().exceptUserMode()
2238 .privSecure(!aarch32EL3);
2241 .secure().exceptUserMode();
2243 .
hyp().monNonSecure();
2248 .privSecureWrite(aarch32EL3);
2260 .privSecure(!aarch32EL3)
2261 .userSecureRead(!aarch32EL3)
2262 .userSecureWrite(!aarch32EL3)
2267 .privSecure(aarch32EL3)
2274 .privSecure(!aarch32EL3)
2275 .userSecureRead(!aarch32EL3)
2276 .userSecureWrite(!aarch32EL3);
2280 .privSecure(aarch32EL3);
2286 .privSecure(!aarch32EL3)
2287 .userSecureRead(!aarch32EL3)
2288 .userSecureWrite(!aarch32EL3);
2292 .privSecure(aarch32EL3);
2324 .allPrivileges().exceptUserMode();
2327 .allPrivileges().exceptUserMode();
2330 .allPrivileges().exceptUserMode();
2333 .allPrivileges().exceptUserMode();
2336 .allPrivileges().exceptUserMode();
2339 .allPrivileges().exceptUserMode();
2342 .allPrivileges().exceptUserMode();
2345 .allPrivileges().exceptUserMode();
2348 .allPrivileges().exceptUserMode();
2351 .writes(1).exceptUserMode();
2354 .allPrivileges().exceptUserMode();
2357 .allPrivileges().exceptUserMode().writes(0);
2359 .
hyp().monNonSecure();
2361 .
hyp().monNonSecure();
2364 .allPrivileges().exceptUserMode();
2368 .allPrivileges().exceptUserMode();
2743 .res0( 0x20440 | (EnDB ? 0 : 0x2000)
2744 | (IESB ? 0 : 0x200000)
2745 | (EnDA ? 0 : 0x8000000)
2746 | (EnIB ? 0 : 0x40000000)
2747 | (EnIA ? 0 : 0x80000000))
2748 .res1(0x500800 | (SPAN ? 0 : 0x800000)
2749 | (nTLSMD ? 0 : 0x8000000)
2750 | (LSMAOE ? 0 : 0x10000000))
2755 .res0( 0x20440 | (EnDB ? 0 : 0x2000)
2756 | (IESB ? 0 : 0x200000)
2757 | (EnDA ? 0 : 0x8000000)
2758 | (EnIB ? 0 : 0x40000000)
2759 | (EnIA ? 0 : 0x80000000))
2760 .res1(0x500800 | (SPAN ? 0 : 0x800000)
2761 | (nTLSMD ? 0 : 0x8000000)
2762 | (LSMAOE ? 0 : 0x10000000))
2776 .res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
2777 | (IESB ? 0 : 0x200000)
2778 | (EnDA ? 0 : 0x8000000)
2779 | (EnIB ? 0 : 0x40000000)
2780 | (EnIA ? 0 : 0x80000000))
2803 .res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
2804 | (IESB ? 0 : 0x200000)
2805 | (EnDA ? 0 : 0x8000000)
2806 | (EnIB ? 0 : 0x40000000)
2807 | (EnIA ? 0 : 0x80000000))
2889 .implemented(
release->
has(ArmExtension::FEAT_PAN));
2983 .writes(1).exceptUserMode();
2989 .writes(1).exceptUserMode();
2992 .writes(1).exceptUserMode();
2995 .writes(1).exceptUserMode();
2997 .
writes(1).exceptUserMode();
2999 .
writes(1).exceptUserMode();
3001 .
writes(1).exceptUserMode();
3003 .
writes(1).exceptUserMode();
3006 .writes(1).exceptUserMode();
3009 .writes(1).exceptUserMode();
3012 .writes(1).userSecureWrite(0);
3029 .
hypWrite().monSecureWrite().monNonSecureWrite();
3031 .
hypWrite().monSecureWrite().monNonSecureWrite();
3033 .
hypWrite().monSecureWrite().monNonSecureWrite();
3035 .
hypWrite().monSecureWrite().monNonSecureWrite();
3041 .
writes(1).exceptUserMode();
3043 .
writes(1).exceptUserMode();
3045 .
writes(1).exceptUserMode();
3047 .
writes(1).exceptUserMode();
3049 .
writes(1).exceptUserMode();
3051 .
writes(1).exceptUserMode();
3053 .
writes(1).exceptUserMode();
3055 .
writes(1).exceptUserMode();
3057 .
writes(1).exceptUserMode();
3059 .
writes(1).exceptUserMode();
3061 .
writes(1).exceptUserMode();
3063 .
writes(1).exceptUserMode();
3065 .
hypWrite().monSecureWrite().monNonSecureWrite();
3067 .
hypWrite().monSecureWrite().monNonSecureWrite();
3073 .
hypWrite().monSecureWrite().monNonSecureWrite();
3077 .
hypWrite().monSecureWrite().monNonSecureWrite();
3079 .
hypWrite().monSecureWrite().monNonSecureWrite();
3081 .
hypWrite().monSecureWrite().monNonSecureWrite();
3087 .
hypWrite().monSecureWrite().monNonSecureWrite();
3091 .
hypWrite().monSecureWrite().monNonSecureWrite();
3195 .
mon().hyp().writes(0);
3227 .privSecureWrite(aarch32EL3)
3239 .res0(0xfffffffffffffff8)
3246 .res0(0xffffffff00000000)
3250 .res0(0xfffffffffffffff8)
3257 .res0(0xffffffff00000000)
3262 .res0(0xfffffffffffffff8)
3271 .res0(0xffffffff00000000)
3276 .res0(0xfffffffffffffff8)
3285 .res0(0xffffffff00000000)
3290 .res0(0xfffffffffffdfc00)
3295 .res0(0xfffffffffffdfc00)
3300 .res0(0xfffffffffffffff8);
3307 .res0(0xffffffff00000000);
3311 .res0(0xfffffffffffc0000)
3316 .res0(0xfffffffffffffff8)
3325 .res0(0xffffffff00000000)
3330 .res0(0xfffffffffffffff8)
3331 .implemented(sel2_implemented);
3335 .implemented(sel2_implemented);
3339 .res0(0xffffffff00000000)
3340 .implemented(sel2_implemented);
3344 .res0(0xfffffffffffffff8)
3345 .implemented(vhe_implemented);
3349 .implemented(vhe_implemented);
3353 .res0(0xffffffff00000000)
3354 .implemented(vhe_implemented);
3358 .res0(0xfffffffffffffff8)
3359 .implemented(vhe_implemented && sel2_implemented);
3363 .implemented(vhe_implemented && sel2_implemented);
3367 .res0(0xffffffff00000000)
3368 .implemented(vhe_implemented && sel2_implemented);
3440 .allPrivileges().exceptUserMode();
3449 .allPrivileges().exceptUserMode()
3462 .allPrivileges().exceptUserMode()
3481 .allPrivileges().exceptUserMode()
3485 .allPrivileges().exceptUserMode()
3492 .allPrivileges().exceptUserMode()
3496 .allPrivileges().exceptUserMode()
3503 .allPrivileges().exceptUserMode()
3507 .allPrivileges().exceptUserMode()
3514 .allPrivileges().exceptUserMode()
3518 .allPrivileges().exceptUserMode()
3522 .allPrivileges().exceptUserMode().reads(0)
3541 .allPrivileges().exceptUserMode().reads(0)
3552 .allPrivileges().exceptUserMode()
3557 .secure().exceptUserMode()
3565 .allPrivileges().exceptUserMode()
3570 .secure().exceptUserMode()
3578 .allPrivileges().exceptUserMode()
3583 .secure().exceptUserMode()
3587 .allPrivileges().exceptUserMode()
3595 .allPrivileges().exceptUserMode()
3600 .secure().exceptUserMode()
3649 .
hyp().mon().writes(0)
3652 .
hyp().mon().writes(0)
3655 .
hyp().mon().writes(0)
3658 .
hyp().mon().writes(0)
3665 .allPrivileges().exceptUserMode();
3668 .allPrivileges().exceptUserMode();
3671 .allPrivileges().exceptUserMode();
3674 .allPrivileges().exceptUserMode();
3677 .allPrivileges().exceptUserMode();
3680 .allPrivileges().exceptUserMode();
3683 .allPrivileges().exceptUserMode();
3686 .allPrivileges().exceptUserMode();
3689 .allPrivileges().exceptUserMode();
3692 .allPrivileges().exceptUserMode();
3695 .allPrivileges().exceptUserMode();
3698 .allPrivileges().exceptUserMode();
3701 .allPrivileges().exceptUserMode();
3704 .allPrivileges().exceptUserMode();
3707 .allPrivileges().exceptUserMode();
3710 .allPrivileges().exceptUserMode();
3825 .
hyp().mon().writes(0);
3827 .
hyp().mon().writes(0);
3829 .
hyp().mon().writes(0);
3831 .
hyp().mon().writes(0);
3984 assert(idxToMiscRegNum.empty());
3985 for (
const auto& [key,
val] : miscRegNumToIdx) {
3986 idxToMiscRegNum.insert({
val, key});