miscregs.cc revision 12530:ab63172c4fbe
1/* 2 * Copyright (c) 2010-2013, 2015-2017 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 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated 11 * unmodified and in its entirety in all distributions of the software, 12 * modified or unmodified, in source code or in binary form. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions are 16 * met: redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer; 18 * redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution; 21 * neither the name of the copyright holders nor the names of its 22 * contributors may be used to endorse or promote products derived from 23 * this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 * 37 * Authors: Gabe Black 38 * Ali Saidi 39 * Giacomo Gabrielli 40 */ 41 42#include "arch/arm/miscregs.hh" 43 44#include <tuple> 45 46#include "arch/arm/isa.hh" 47#include "base/logging.hh" 48#include "cpu/thread_context.hh" 49#include "sim/full_system.hh" 50 51namespace ArmISA 52{ 53 54MiscRegIndex 55decodeCP14Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2) 56{ 57 switch(crn) { 58 case 0: 59 switch (opc1) { 60 case 0: 61 switch (opc2) { 62 case 0: 63 switch (crm) { 64 case 0: 65 return MISCREG_DBGDIDR; 66 case 1: 67 return MISCREG_DBGDSCRint; 68 } 69 break; 70 } 71 break; 72 case 7: 73 switch (opc2) { 74 case 0: 75 switch (crm) { 76 case 0: 77 return MISCREG_JIDR; 78 } 79 break; 80 } 81 break; 82 } 83 break; 84 case 1: 85 switch (opc1) { 86 case 6: 87 switch (crm) { 88 case 0: 89 switch (opc2) { 90 case 0: 91 return MISCREG_TEEHBR; 92 } 93 break; 94 } 95 break; 96 case 7: 97 switch (crm) { 98 case 0: 99 switch (opc2) { 100 case 0: 101 return MISCREG_JOSCR; 102 } 103 break; 104 } 105 break; 106 } 107 break; 108 case 2: 109 switch (opc1) { 110 case 7: 111 switch (crm) { 112 case 0: 113 switch (opc2) { 114 case 0: 115 return MISCREG_JMCR; 116 } 117 break; 118 } 119 break; 120 } 121 break; 122 } 123 // If we get here then it must be a register that we haven't implemented 124 warn("CP14 unimplemented crn[%d], opc1[%d], crm[%d], opc2[%d]", 125 crn, opc1, crm, opc2); 126 return MISCREG_CP14_UNIMPL; 127} 128 129using namespace std; 130 131MiscRegIndex 132decodeCP15Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2) 133{ 134 switch (crn) { 135 case 0: 136 switch (opc1) { 137 case 0: 138 switch (crm) { 139 case 0: 140 switch (opc2) { 141 case 1: 142 return MISCREG_CTR; 143 case 2: 144 return MISCREG_TCMTR; 145 case 3: 146 return MISCREG_TLBTR; 147 case 5: 148 return MISCREG_MPIDR; 149 case 6: 150 return MISCREG_REVIDR; 151 default: 152 return MISCREG_MIDR; 153 } 154 break; 155 case 1: 156 switch (opc2) { 157 case 0: 158 return MISCREG_ID_PFR0; 159 case 1: 160 return MISCREG_ID_PFR1; 161 case 2: 162 return MISCREG_ID_DFR0; 163 case 3: 164 return MISCREG_ID_AFR0; 165 case 4: 166 return MISCREG_ID_MMFR0; 167 case 5: 168 return MISCREG_ID_MMFR1; 169 case 6: 170 return MISCREG_ID_MMFR2; 171 case 7: 172 return MISCREG_ID_MMFR3; 173 } 174 break; 175 case 2: 176 switch (opc2) { 177 case 0: 178 return MISCREG_ID_ISAR0; 179 case 1: 180 return MISCREG_ID_ISAR1; 181 case 2: 182 return MISCREG_ID_ISAR2; 183 case 3: 184 return MISCREG_ID_ISAR3; 185 case 4: 186 return MISCREG_ID_ISAR4; 187 case 5: 188 return MISCREG_ID_ISAR5; 189 case 6: 190 case 7: 191 return MISCREG_RAZ; // read as zero 192 } 193 break; 194 default: 195 return MISCREG_RAZ; // read as zero 196 } 197 break; 198 case 1: 199 if (crm == 0) { 200 switch (opc2) { 201 case 0: 202 return MISCREG_CCSIDR; 203 case 1: 204 return MISCREG_CLIDR; 205 case 7: 206 return MISCREG_AIDR; 207 } 208 } 209 break; 210 case 2: 211 if (crm == 0 && opc2 == 0) { 212 return MISCREG_CSSELR; 213 } 214 break; 215 case 4: 216 if (crm == 0) { 217 if (opc2 == 0) 218 return MISCREG_VPIDR; 219 else if (opc2 == 5) 220 return MISCREG_VMPIDR; 221 } 222 break; 223 } 224 break; 225 case 1: 226 if (opc1 == 0) { 227 if (crm == 0) { 228 switch (opc2) { 229 case 0: 230 return MISCREG_SCTLR; 231 case 1: 232 return MISCREG_ACTLR; 233 case 0x2: 234 return MISCREG_CPACR; 235 } 236 } else if (crm == 1) { 237 switch (opc2) { 238 case 0: 239 return MISCREG_SCR; 240 case 1: 241 return MISCREG_SDER; 242 case 2: 243 return MISCREG_NSACR; 244 } 245 } 246 } else if (opc1 == 4) { 247 if (crm == 0) { 248 if (opc2 == 0) 249 return MISCREG_HSCTLR; 250 else if (opc2 == 1) 251 return MISCREG_HACTLR; 252 } else if (crm == 1) { 253 switch (opc2) { 254 case 0: 255 return MISCREG_HCR; 256 case 1: 257 return MISCREG_HDCR; 258 case 2: 259 return MISCREG_HCPTR; 260 case 3: 261 return MISCREG_HSTR; 262 case 7: 263 return MISCREG_HACR; 264 } 265 } 266 } 267 break; 268 case 2: 269 if (opc1 == 0 && crm == 0) { 270 switch (opc2) { 271 case 0: 272 return MISCREG_TTBR0; 273 case 1: 274 return MISCREG_TTBR1; 275 case 2: 276 return MISCREG_TTBCR; 277 } 278 } else if (opc1 == 4) { 279 if (crm == 0 && opc2 == 2) 280 return MISCREG_HTCR; 281 else if (crm == 1 && opc2 == 2) 282 return MISCREG_VTCR; 283 } 284 break; 285 case 3: 286 if (opc1 == 0 && crm == 0 && opc2 == 0) { 287 return MISCREG_DACR; 288 } 289 break; 290 case 5: 291 if (opc1 == 0) { 292 if (crm == 0) { 293 if (opc2 == 0) { 294 return MISCREG_DFSR; 295 } else if (opc2 == 1) { 296 return MISCREG_IFSR; 297 } 298 } else if (crm == 1) { 299 if (opc2 == 0) { 300 return MISCREG_ADFSR; 301 } else if (opc2 == 1) { 302 return MISCREG_AIFSR; 303 } 304 } 305 } else if (opc1 == 4) { 306 if (crm == 1) { 307 if (opc2 == 0) 308 return MISCREG_HADFSR; 309 else if (opc2 == 1) 310 return MISCREG_HAIFSR; 311 } else if (crm == 2 && opc2 == 0) { 312 return MISCREG_HSR; 313 } 314 } 315 break; 316 case 6: 317 if (opc1 == 0 && crm == 0) { 318 switch (opc2) { 319 case 0: 320 return MISCREG_DFAR; 321 case 2: 322 return MISCREG_IFAR; 323 } 324 } else if (opc1 == 4 && crm == 0) { 325 switch (opc2) { 326 case 0: 327 return MISCREG_HDFAR; 328 case 2: 329 return MISCREG_HIFAR; 330 case 4: 331 return MISCREG_HPFAR; 332 } 333 } 334 break; 335 case 7: 336 if (opc1 == 0) { 337 switch (crm) { 338 case 0: 339 if (opc2 == 4) { 340 return MISCREG_NOP; 341 } 342 break; 343 case 1: 344 switch (opc2) { 345 case 0: 346 return MISCREG_ICIALLUIS; 347 case 6: 348 return MISCREG_BPIALLIS; 349 } 350 break; 351 case 4: 352 if (opc2 == 0) { 353 return MISCREG_PAR; 354 } 355 break; 356 case 5: 357 switch (opc2) { 358 case 0: 359 return MISCREG_ICIALLU; 360 case 1: 361 return MISCREG_ICIMVAU; 362 case 4: 363 return MISCREG_CP15ISB; 364 case 6: 365 return MISCREG_BPIALL; 366 case 7: 367 return MISCREG_BPIMVA; 368 } 369 break; 370 case 6: 371 if (opc2 == 1) { 372 return MISCREG_DCIMVAC; 373 } else if (opc2 == 2) { 374 return MISCREG_DCISW; 375 } 376 break; 377 case 8: 378 switch (opc2) { 379 case 0: 380 return MISCREG_ATS1CPR; 381 case 1: 382 return MISCREG_ATS1CPW; 383 case 2: 384 return MISCREG_ATS1CUR; 385 case 3: 386 return MISCREG_ATS1CUW; 387 case 4: 388 return MISCREG_ATS12NSOPR; 389 case 5: 390 return MISCREG_ATS12NSOPW; 391 case 6: 392 return MISCREG_ATS12NSOUR; 393 case 7: 394 return MISCREG_ATS12NSOUW; 395 } 396 break; 397 case 10: 398 switch (opc2) { 399 case 1: 400 return MISCREG_DCCMVAC; 401 case 2: 402 return MISCREG_DCCSW; 403 case 4: 404 return MISCREG_CP15DSB; 405 case 5: 406 return MISCREG_CP15DMB; 407 } 408 break; 409 case 11: 410 if (opc2 == 1) { 411 return MISCREG_DCCMVAU; 412 } 413 break; 414 case 13: 415 if (opc2 == 1) { 416 return MISCREG_NOP; 417 } 418 break; 419 case 14: 420 if (opc2 == 1) { 421 return MISCREG_DCCIMVAC; 422 } else if (opc2 == 2) { 423 return MISCREG_DCCISW; 424 } 425 break; 426 } 427 } else if (opc1 == 4 && crm == 8) { 428 if (opc2 == 0) 429 return MISCREG_ATS1HR; 430 else if (opc2 == 1) 431 return MISCREG_ATS1HW; 432 } 433 break; 434 case 8: 435 if (opc1 == 0) { 436 switch (crm) { 437 case 3: 438 switch (opc2) { 439 case 0: 440 return MISCREG_TLBIALLIS; 441 case 1: 442 return MISCREG_TLBIMVAIS; 443 case 2: 444 return MISCREG_TLBIASIDIS; 445 case 3: 446 return MISCREG_TLBIMVAAIS; 447 } 448 break; 449 case 5: 450 switch (opc2) { 451 case 0: 452 return MISCREG_ITLBIALL; 453 case 1: 454 return MISCREG_ITLBIMVA; 455 case 2: 456 return MISCREG_ITLBIASID; 457 } 458 break; 459 case 6: 460 switch (opc2) { 461 case 0: 462 return MISCREG_DTLBIALL; 463 case 1: 464 return MISCREG_DTLBIMVA; 465 case 2: 466 return MISCREG_DTLBIASID; 467 } 468 break; 469 case 7: 470 switch (opc2) { 471 case 0: 472 return MISCREG_TLBIALL; 473 case 1: 474 return MISCREG_TLBIMVA; 475 case 2: 476 return MISCREG_TLBIASID; 477 case 3: 478 return MISCREG_TLBIMVAA; 479 } 480 break; 481 } 482 } else if (opc1 == 4) { 483 if (crm == 3) { 484 switch (opc2) { 485 case 0: 486 return MISCREG_TLBIALLHIS; 487 case 1: 488 return MISCREG_TLBIMVAHIS; 489 case 4: 490 return MISCREG_TLBIALLNSNHIS; 491 } 492 } else if (crm == 7) { 493 switch (opc2) { 494 case 0: 495 return MISCREG_TLBIALLH; 496 case 1: 497 return MISCREG_TLBIMVAH; 498 case 4: 499 return MISCREG_TLBIALLNSNH; 500 } 501 } 502 } 503 break; 504 case 9: 505 // Every cop register with CRn = 9 and CRm in 506 // {0-2}, {5-8} is implementation defined regardless 507 // of opc1 and opc2. 508 switch (crm) { 509 case 0: 510 case 1: 511 case 2: 512 case 5: 513 case 6: 514 case 7: 515 case 8: 516 return MISCREG_IMPDEF_UNIMPL; 517 } 518 if (opc1 == 0) { 519 switch (crm) { 520 case 12: 521 switch (opc2) { 522 case 0: 523 return MISCREG_PMCR; 524 case 1: 525 return MISCREG_PMCNTENSET; 526 case 2: 527 return MISCREG_PMCNTENCLR; 528 case 3: 529 return MISCREG_PMOVSR; 530 case 4: 531 return MISCREG_PMSWINC; 532 case 5: 533 return MISCREG_PMSELR; 534 case 6: 535 return MISCREG_PMCEID0; 536 case 7: 537 return MISCREG_PMCEID1; 538 } 539 break; 540 case 13: 541 switch (opc2) { 542 case 0: 543 return MISCREG_PMCCNTR; 544 case 1: 545 // Selector is PMSELR.SEL 546 return MISCREG_PMXEVTYPER_PMCCFILTR; 547 case 2: 548 return MISCREG_PMXEVCNTR; 549 } 550 break; 551 case 14: 552 switch (opc2) { 553 case 0: 554 return MISCREG_PMUSERENR; 555 case 1: 556 return MISCREG_PMINTENSET; 557 case 2: 558 return MISCREG_PMINTENCLR; 559 case 3: 560 return MISCREG_PMOVSSET; 561 } 562 break; 563 } 564 } else if (opc1 == 1) { 565 switch (crm) { 566 case 0: 567 switch (opc2) { 568 case 2: // L2CTLR, L2 Control Register 569 return MISCREG_L2CTLR; 570 case 3: 571 return MISCREG_L2ECTLR; 572 } 573 break; 574 break; 575 } 576 } 577 break; 578 case 10: 579 if (opc1 == 0) { 580 // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown 581 if (crm < 2) { 582 return MISCREG_IMPDEF_UNIMPL; 583 } else if (crm == 2) { // TEX Remap Registers 584 if (opc2 == 0) { 585 // Selector is TTBCR.EAE 586 return MISCREG_PRRR_MAIR0; 587 } else if (opc2 == 1) { 588 // Selector is TTBCR.EAE 589 return MISCREG_NMRR_MAIR1; 590 } 591 } else if (crm == 3) { 592 if (opc2 == 0) { 593 return MISCREG_AMAIR0; 594 } else if (opc2 == 1) { 595 return MISCREG_AMAIR1; 596 } 597 } 598 } else if (opc1 == 4) { 599 // crm 0, 1, 4, and 8, with op2 0 - 7, reserved for TLB lockdown 600 if (crm == 2) { 601 if (opc2 == 0) 602 return MISCREG_HMAIR0; 603 else if (opc2 == 1) 604 return MISCREG_HMAIR1; 605 } else if (crm == 3) { 606 if (opc2 == 0) 607 return MISCREG_HAMAIR0; 608 else if (opc2 == 1) 609 return MISCREG_HAMAIR1; 610 } 611 } 612 break; 613 case 11: 614 if (opc1 <=7) { 615 switch (crm) { 616 case 0: 617 case 1: 618 case 2: 619 case 3: 620 case 4: 621 case 5: 622 case 6: 623 case 7: 624 case 8: 625 case 15: 626 // Reserved for DMA operations for TCM access 627 return MISCREG_IMPDEF_UNIMPL; 628 default: 629 break; 630 } 631 } 632 break; 633 case 12: 634 if (opc1 == 0) { 635 if (crm == 0) { 636 if (opc2 == 0) { 637 return MISCREG_VBAR; 638 } else if (opc2 == 1) { 639 return MISCREG_MVBAR; 640 } 641 } else if (crm == 1) { 642 if (opc2 == 0) { 643 return MISCREG_ISR; 644 } 645 } 646 } else if (opc1 == 4) { 647 if (crm == 0 && opc2 == 0) 648 return MISCREG_HVBAR; 649 } 650 break; 651 case 13: 652 if (opc1 == 0) { 653 if (crm == 0) { 654 switch (opc2) { 655 case 0: 656 return MISCREG_FCSEIDR; 657 case 1: 658 return MISCREG_CONTEXTIDR; 659 case 2: 660 return MISCREG_TPIDRURW; 661 case 3: 662 return MISCREG_TPIDRURO; 663 case 4: 664 return MISCREG_TPIDRPRW; 665 } 666 } 667 } else if (opc1 == 4) { 668 if (crm == 0 && opc2 == 2) 669 return MISCREG_HTPIDR; 670 } 671 break; 672 case 14: 673 if (opc1 == 0) { 674 switch (crm) { 675 case 0: 676 if (opc2 == 0) 677 return MISCREG_CNTFRQ; 678 break; 679 case 1: 680 if (opc2 == 0) 681 return MISCREG_CNTKCTL; 682 break; 683 case 2: 684 if (opc2 == 0) 685 return MISCREG_CNTP_TVAL; 686 else if (opc2 == 1) 687 return MISCREG_CNTP_CTL; 688 break; 689 case 3: 690 if (opc2 == 0) 691 return MISCREG_CNTV_TVAL; 692 else if (opc2 == 1) 693 return MISCREG_CNTV_CTL; 694 break; 695 } 696 } else if (opc1 == 4) { 697 if (crm == 1 && opc2 == 0) { 698 return MISCREG_CNTHCTL; 699 } else if (crm == 2) { 700 if (opc2 == 0) 701 return MISCREG_CNTHP_TVAL; 702 else if (opc2 == 1) 703 return MISCREG_CNTHP_CTL; 704 } 705 } 706 break; 707 case 15: 708 // Implementation defined 709 return MISCREG_IMPDEF_UNIMPL; 710 } 711 // Unrecognized register 712 return MISCREG_CP15_UNIMPL; 713} 714 715MiscRegIndex 716decodeCP15Reg64(unsigned crm, unsigned opc1) 717{ 718 switch (crm) { 719 case 2: 720 switch (opc1) { 721 case 0: 722 return MISCREG_TTBR0; 723 case 1: 724 return MISCREG_TTBR1; 725 case 4: 726 return MISCREG_HTTBR; 727 case 6: 728 return MISCREG_VTTBR; 729 } 730 break; 731 case 7: 732 if (opc1 == 0) 733 return MISCREG_PAR; 734 break; 735 case 14: 736 switch (opc1) { 737 case 0: 738 return MISCREG_CNTPCT; 739 case 1: 740 return MISCREG_CNTVCT; 741 case 2: 742 return MISCREG_CNTP_CVAL; 743 case 3: 744 return MISCREG_CNTV_CVAL; 745 case 4: 746 return MISCREG_CNTVOFF; 747 case 6: 748 return MISCREG_CNTHP_CVAL; 749 } 750 break; 751 case 15: 752 if (opc1 == 0) 753 return MISCREG_CPUMERRSR; 754 else if (opc1 == 1) 755 return MISCREG_L2MERRSR; 756 break; 757 } 758 // Unrecognized register 759 return MISCREG_CP15_UNIMPL; 760} 761 762std::tuple<bool, bool> 763canReadCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr) 764{ 765 bool secure = !scr.ns; 766 bool canRead = false; 767 bool undefined = false; 768 769 switch (cpsr.mode) { 770 case MODE_USER: 771 canRead = secure ? miscRegInfo[reg][MISCREG_USR_S_RD] : 772 miscRegInfo[reg][MISCREG_USR_NS_RD]; 773 break; 774 case MODE_FIQ: 775 case MODE_IRQ: 776 case MODE_SVC: 777 case MODE_ABORT: 778 case MODE_UNDEFINED: 779 case MODE_SYSTEM: 780 canRead = secure ? miscRegInfo[reg][MISCREG_PRI_S_RD] : 781 miscRegInfo[reg][MISCREG_PRI_NS_RD]; 782 break; 783 case MODE_MON: 784 canRead = secure ? miscRegInfo[reg][MISCREG_MON_NS0_RD] : 785 miscRegInfo[reg][MISCREG_MON_NS1_RD]; 786 break; 787 case MODE_HYP: 788 canRead = miscRegInfo[reg][MISCREG_HYP_RD]; 789 break; 790 default: 791 undefined = true; 792 } 793 // can't do permissions checkes on the root of a banked pair of regs 794 assert(!miscRegInfo[reg][MISCREG_BANKED]); 795 return std::make_tuple(canRead, undefined); 796} 797 798std::tuple<bool, bool> 799canWriteCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr) 800{ 801 bool secure = !scr.ns; 802 bool canWrite = false; 803 bool undefined = false; 804 805 switch (cpsr.mode) { 806 case MODE_USER: 807 canWrite = secure ? miscRegInfo[reg][MISCREG_USR_S_WR] : 808 miscRegInfo[reg][MISCREG_USR_NS_WR]; 809 break; 810 case MODE_FIQ: 811 case MODE_IRQ: 812 case MODE_SVC: 813 case MODE_ABORT: 814 case MODE_UNDEFINED: 815 case MODE_SYSTEM: 816 canWrite = secure ? miscRegInfo[reg][MISCREG_PRI_S_WR] : 817 miscRegInfo[reg][MISCREG_PRI_NS_WR]; 818 break; 819 case MODE_MON: 820 canWrite = secure ? miscRegInfo[reg][MISCREG_MON_NS0_WR] : 821 miscRegInfo[reg][MISCREG_MON_NS1_WR]; 822 break; 823 case MODE_HYP: 824 canWrite = miscRegInfo[reg][MISCREG_HYP_WR]; 825 break; 826 default: 827 undefined = true; 828 } 829 // can't do permissions checkes on the root of a banked pair of regs 830 assert(!miscRegInfo[reg][MISCREG_BANKED]); 831 return std::make_tuple(canWrite, undefined); 832} 833 834int 835snsBankedIndex(MiscRegIndex reg, ThreadContext *tc) 836{ 837 SCR scr = tc->readMiscReg(MISCREG_SCR); 838 return snsBankedIndex(reg, tc, scr.ns); 839} 840 841int 842snsBankedIndex(MiscRegIndex reg, ThreadContext *tc, bool ns) 843{ 844 int reg_as_int = static_cast<int>(reg); 845 if (miscRegInfo[reg][MISCREG_BANKED]) { 846 reg_as_int += (ArmSystem::haveSecurity(tc) && 847 !ArmSystem::highestELIs64(tc) && !ns) ? 2 : 1; 848 } 849 return reg_as_int; 850} 851 852 853/** 854 * If the reg is a child reg of a banked set, then the parent is the last 855 * banked one in the list. This is messy, and the wish is to eventually have 856 * the bitmap replaced with a better data structure. the preUnflatten function 857 * initializes a lookup table to speed up the search for these banked 858 * registers. 859 */ 860 861int unflattenResultMiscReg[NUM_MISCREGS]; 862 863void 864preUnflattenMiscReg() 865{ 866 int reg = -1; 867 for (int i = 0 ; i < NUM_MISCREGS; i++){ 868 if (miscRegInfo[i][MISCREG_BANKED]) 869 reg = i; 870 if (miscRegInfo[i][MISCREG_BANKED_CHILD]) 871 unflattenResultMiscReg[i] = reg; 872 else 873 unflattenResultMiscReg[i] = i; 874 // if this assert fails, no parent was found, and something is broken 875 assert(unflattenResultMiscReg[i] > -1); 876 } 877} 878 879int 880unflattenMiscReg(int reg) 881{ 882 return unflattenResultMiscReg[reg]; 883} 884 885bool 886canReadAArch64SysReg(MiscRegIndex reg, SCR scr, CPSR cpsr, ThreadContext *tc) 887{ 888 // Check for SP_EL0 access while SPSEL == 0 889 if ((reg == MISCREG_SP_EL0) && (tc->readMiscReg(MISCREG_SPSEL) == 0)) 890 return false; 891 892 // Check for RVBAR access 893 if (reg == MISCREG_RVBAR_EL1) { 894 ExceptionLevel highest_el = ArmSystem::highestEL(tc); 895 if (highest_el == EL2 || highest_el == EL3) 896 return false; 897 } 898 if (reg == MISCREG_RVBAR_EL2) { 899 ExceptionLevel highest_el = ArmSystem::highestEL(tc); 900 if (highest_el == EL3) 901 return false; 902 } 903 904 bool secure = ArmSystem::haveSecurity(tc) && !scr.ns; 905 906 switch (opModeToEL((OperatingMode) (uint8_t) cpsr.mode)) { 907 case EL0: 908 return secure ? miscRegInfo[reg][MISCREG_USR_S_RD] : 909 miscRegInfo[reg][MISCREG_USR_NS_RD]; 910 case EL1: 911 return secure ? miscRegInfo[reg][MISCREG_PRI_S_RD] : 912 miscRegInfo[reg][MISCREG_PRI_NS_RD]; 913 case EL2: 914 return miscRegInfo[reg][MISCREG_HYP_RD]; 915 case EL3: 916 return secure ? miscRegInfo[reg][MISCREG_MON_NS0_RD] : 917 miscRegInfo[reg][MISCREG_MON_NS1_RD]; 918 default: 919 panic("Invalid exception level"); 920 } 921} 922 923bool 924canWriteAArch64SysReg(MiscRegIndex reg, SCR scr, CPSR cpsr, ThreadContext *tc) 925{ 926 // Check for SP_EL0 access while SPSEL == 0 927 if ((reg == MISCREG_SP_EL0) && (tc->readMiscReg(MISCREG_SPSEL) == 0)) 928 return false; 929 ExceptionLevel el = opModeToEL((OperatingMode) (uint8_t) cpsr.mode); 930 if (reg == MISCREG_DAIF) { 931 SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1); 932 if (el == EL0 && !sctlr.uma) 933 return false; 934 } 935 if (FullSystem && reg == MISCREG_DC_ZVA_Xt) { 936 // In syscall-emulation mode, this test is skipped and DCZVA is always 937 // allowed at EL0 938 SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1); 939 if (el == EL0 && !sctlr.dze) 940 return false; 941 } 942 if (reg == MISCREG_DC_CVAC_Xt || reg == MISCREG_DC_CIVAC_Xt) { 943 SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1); 944 if (el == EL0 && !sctlr.uci) 945 return false; 946 } 947 948 bool secure = ArmSystem::haveSecurity(tc) && !scr.ns; 949 950 switch (el) { 951 case EL0: 952 return secure ? miscRegInfo[reg][MISCREG_USR_S_WR] : 953 miscRegInfo[reg][MISCREG_USR_NS_WR]; 954 case EL1: 955 return secure ? miscRegInfo[reg][MISCREG_PRI_S_WR] : 956 miscRegInfo[reg][MISCREG_PRI_NS_WR]; 957 case EL2: 958 return miscRegInfo[reg][MISCREG_HYP_WR]; 959 case EL3: 960 return secure ? miscRegInfo[reg][MISCREG_MON_NS0_WR] : 961 miscRegInfo[reg][MISCREG_MON_NS1_WR]; 962 default: 963 panic("Invalid exception level"); 964 } 965} 966 967MiscRegIndex 968decodeAArch64SysReg(unsigned op0, unsigned op1, 969 unsigned crn, unsigned crm, 970 unsigned op2) 971{ 972 switch (op0) { 973 case 1: 974 switch (crn) { 975 case 7: 976 switch (op1) { 977 case 0: 978 switch (crm) { 979 case 1: 980 switch (op2) { 981 case 0: 982 return MISCREG_IC_IALLUIS; 983 } 984 break; 985 case 5: 986 switch (op2) { 987 case 0: 988 return MISCREG_IC_IALLU; 989 } 990 break; 991 case 6: 992 switch (op2) { 993 case 1: 994 return MISCREG_DC_IVAC_Xt; 995 case 2: 996 return MISCREG_DC_ISW_Xt; 997 } 998 break; 999 case 8: 1000 switch (op2) { 1001 case 0: 1002 return MISCREG_AT_S1E1R_Xt; 1003 case 1: 1004 return MISCREG_AT_S1E1W_Xt; 1005 case 2: 1006 return MISCREG_AT_S1E0R_Xt; 1007 case 3: 1008 return MISCREG_AT_S1E0W_Xt; 1009 } 1010 break; 1011 case 10: 1012 switch (op2) { 1013 case 2: 1014 return MISCREG_DC_CSW_Xt; 1015 } 1016 break; 1017 case 14: 1018 switch (op2) { 1019 case 2: 1020 return MISCREG_DC_CISW_Xt; 1021 } 1022 break; 1023 } 1024 break; 1025 case 3: 1026 switch (crm) { 1027 case 4: 1028 switch (op2) { 1029 case 1: 1030 return MISCREG_DC_ZVA_Xt; 1031 } 1032 break; 1033 case 5: 1034 switch (op2) { 1035 case 1: 1036 return MISCREG_IC_IVAU_Xt; 1037 } 1038 break; 1039 case 10: 1040 switch (op2) { 1041 case 1: 1042 return MISCREG_DC_CVAC_Xt; 1043 } 1044 break; 1045 case 11: 1046 switch (op2) { 1047 case 1: 1048 return MISCREG_DC_CVAU_Xt; 1049 } 1050 break; 1051 case 14: 1052 switch (op2) { 1053 case 1: 1054 return MISCREG_DC_CIVAC_Xt; 1055 } 1056 break; 1057 } 1058 break; 1059 case 4: 1060 switch (crm) { 1061 case 8: 1062 switch (op2) { 1063 case 0: 1064 return MISCREG_AT_S1E2R_Xt; 1065 case 1: 1066 return MISCREG_AT_S1E2W_Xt; 1067 case 4: 1068 return MISCREG_AT_S12E1R_Xt; 1069 case 5: 1070 return MISCREG_AT_S12E1W_Xt; 1071 case 6: 1072 return MISCREG_AT_S12E0R_Xt; 1073 case 7: 1074 return MISCREG_AT_S12E0W_Xt; 1075 } 1076 break; 1077 } 1078 break; 1079 case 6: 1080 switch (crm) { 1081 case 8: 1082 switch (op2) { 1083 case 0: 1084 return MISCREG_AT_S1E3R_Xt; 1085 case 1: 1086 return MISCREG_AT_S1E3W_Xt; 1087 } 1088 break; 1089 } 1090 break; 1091 } 1092 break; 1093 case 8: 1094 switch (op1) { 1095 case 0: 1096 switch (crm) { 1097 case 3: 1098 switch (op2) { 1099 case 0: 1100 return MISCREG_TLBI_VMALLE1IS; 1101 case 1: 1102 return MISCREG_TLBI_VAE1IS_Xt; 1103 case 2: 1104 return MISCREG_TLBI_ASIDE1IS_Xt; 1105 case 3: 1106 return MISCREG_TLBI_VAAE1IS_Xt; 1107 case 5: 1108 return MISCREG_TLBI_VALE1IS_Xt; 1109 case 7: 1110 return MISCREG_TLBI_VAALE1IS_Xt; 1111 } 1112 break; 1113 case 7: 1114 switch (op2) { 1115 case 0: 1116 return MISCREG_TLBI_VMALLE1; 1117 case 1: 1118 return MISCREG_TLBI_VAE1_Xt; 1119 case 2: 1120 return MISCREG_TLBI_ASIDE1_Xt; 1121 case 3: 1122 return MISCREG_TLBI_VAAE1_Xt; 1123 case 5: 1124 return MISCREG_TLBI_VALE1_Xt; 1125 case 7: 1126 return MISCREG_TLBI_VAALE1_Xt; 1127 } 1128 break; 1129 } 1130 break; 1131 case 4: 1132 switch (crm) { 1133 case 0: 1134 switch (op2) { 1135 case 1: 1136 return MISCREG_TLBI_IPAS2E1IS_Xt; 1137 case 5: 1138 return MISCREG_TLBI_IPAS2LE1IS_Xt; 1139 } 1140 break; 1141 case 3: 1142 switch (op2) { 1143 case 0: 1144 return MISCREG_TLBI_ALLE2IS; 1145 case 1: 1146 return MISCREG_TLBI_VAE2IS_Xt; 1147 case 4: 1148 return MISCREG_TLBI_ALLE1IS; 1149 case 5: 1150 return MISCREG_TLBI_VALE2IS_Xt; 1151 case 6: 1152 return MISCREG_TLBI_VMALLS12E1IS; 1153 } 1154 break; 1155 case 4: 1156 switch (op2) { 1157 case 1: 1158 return MISCREG_TLBI_IPAS2E1_Xt; 1159 case 5: 1160 return MISCREG_TLBI_IPAS2LE1_Xt; 1161 } 1162 break; 1163 case 7: 1164 switch (op2) { 1165 case 0: 1166 return MISCREG_TLBI_ALLE2; 1167 case 1: 1168 return MISCREG_TLBI_VAE2_Xt; 1169 case 4: 1170 return MISCREG_TLBI_ALLE1; 1171 case 5: 1172 return MISCREG_TLBI_VALE2_Xt; 1173 case 6: 1174 return MISCREG_TLBI_VMALLS12E1; 1175 } 1176 break; 1177 } 1178 break; 1179 case 6: 1180 switch (crm) { 1181 case 3: 1182 switch (op2) { 1183 case 0: 1184 return MISCREG_TLBI_ALLE3IS; 1185 case 1: 1186 return MISCREG_TLBI_VAE3IS_Xt; 1187 case 5: 1188 return MISCREG_TLBI_VALE3IS_Xt; 1189 } 1190 break; 1191 case 7: 1192 switch (op2) { 1193 case 0: 1194 return MISCREG_TLBI_ALLE3; 1195 case 1: 1196 return MISCREG_TLBI_VAE3_Xt; 1197 case 5: 1198 return MISCREG_TLBI_VALE3_Xt; 1199 } 1200 break; 1201 } 1202 break; 1203 } 1204 break; 1205 } 1206 break; 1207 case 2: 1208 switch (crn) { 1209 case 0: 1210 switch (op1) { 1211 case 0: 1212 switch (crm) { 1213 case 0: 1214 switch (op2) { 1215 case 2: 1216 return MISCREG_OSDTRRX_EL1; 1217 case 4: 1218 return MISCREG_DBGBVR0_EL1; 1219 case 5: 1220 return MISCREG_DBGBCR0_EL1; 1221 case 6: 1222 return MISCREG_DBGWVR0_EL1; 1223 case 7: 1224 return MISCREG_DBGWCR0_EL1; 1225 } 1226 break; 1227 case 1: 1228 switch (op2) { 1229 case 4: 1230 return MISCREG_DBGBVR1_EL1; 1231 case 5: 1232 return MISCREG_DBGBCR1_EL1; 1233 case 6: 1234 return MISCREG_DBGWVR1_EL1; 1235 case 7: 1236 return MISCREG_DBGWCR1_EL1; 1237 } 1238 break; 1239 case 2: 1240 switch (op2) { 1241 case 0: 1242 return MISCREG_MDCCINT_EL1; 1243 case 2: 1244 return MISCREG_MDSCR_EL1; 1245 case 4: 1246 return MISCREG_DBGBVR2_EL1; 1247 case 5: 1248 return MISCREG_DBGBCR2_EL1; 1249 case 6: 1250 return MISCREG_DBGWVR2_EL1; 1251 case 7: 1252 return MISCREG_DBGWCR2_EL1; 1253 } 1254 break; 1255 case 3: 1256 switch (op2) { 1257 case 2: 1258 return MISCREG_OSDTRTX_EL1; 1259 case 4: 1260 return MISCREG_DBGBVR3_EL1; 1261 case 5: 1262 return MISCREG_DBGBCR3_EL1; 1263 case 6: 1264 return MISCREG_DBGWVR3_EL1; 1265 case 7: 1266 return MISCREG_DBGWCR3_EL1; 1267 } 1268 break; 1269 case 4: 1270 switch (op2) { 1271 case 4: 1272 return MISCREG_DBGBVR4_EL1; 1273 case 5: 1274 return MISCREG_DBGBCR4_EL1; 1275 } 1276 break; 1277 case 5: 1278 switch (op2) { 1279 case 4: 1280 return MISCREG_DBGBVR5_EL1; 1281 case 5: 1282 return MISCREG_DBGBCR5_EL1; 1283 } 1284 break; 1285 case 6: 1286 switch (op2) { 1287 case 2: 1288 return MISCREG_OSECCR_EL1; 1289 } 1290 break; 1291 } 1292 break; 1293 case 2: 1294 switch (crm) { 1295 case 0: 1296 switch (op2) { 1297 case 0: 1298 return MISCREG_TEECR32_EL1; 1299 } 1300 break; 1301 } 1302 break; 1303 case 3: 1304 switch (crm) { 1305 case 1: 1306 switch (op2) { 1307 case 0: 1308 return MISCREG_MDCCSR_EL0; 1309 } 1310 break; 1311 case 4: 1312 switch (op2) { 1313 case 0: 1314 return MISCREG_MDDTR_EL0; 1315 } 1316 break; 1317 case 5: 1318 switch (op2) { 1319 case 0: 1320 return MISCREG_MDDTRRX_EL0; 1321 } 1322 break; 1323 } 1324 break; 1325 case 4: 1326 switch (crm) { 1327 case 7: 1328 switch (op2) { 1329 case 0: 1330 return MISCREG_DBGVCR32_EL2; 1331 } 1332 break; 1333 } 1334 break; 1335 } 1336 break; 1337 case 1: 1338 switch (op1) { 1339 case 0: 1340 switch (crm) { 1341 case 0: 1342 switch (op2) { 1343 case 0: 1344 return MISCREG_MDRAR_EL1; 1345 case 4: 1346 return MISCREG_OSLAR_EL1; 1347 } 1348 break; 1349 case 1: 1350 switch (op2) { 1351 case 4: 1352 return MISCREG_OSLSR_EL1; 1353 } 1354 break; 1355 case 3: 1356 switch (op2) { 1357 case 4: 1358 return MISCREG_OSDLR_EL1; 1359 } 1360 break; 1361 case 4: 1362 switch (op2) { 1363 case 4: 1364 return MISCREG_DBGPRCR_EL1; 1365 } 1366 break; 1367 } 1368 break; 1369 case 2: 1370 switch (crm) { 1371 case 0: 1372 switch (op2) { 1373 case 0: 1374 return MISCREG_TEEHBR32_EL1; 1375 } 1376 break; 1377 } 1378 break; 1379 } 1380 break; 1381 case 7: 1382 switch (op1) { 1383 case 0: 1384 switch (crm) { 1385 case 8: 1386 switch (op2) { 1387 case 6: 1388 return MISCREG_DBGCLAIMSET_EL1; 1389 } 1390 break; 1391 case 9: 1392 switch (op2) { 1393 case 6: 1394 return MISCREG_DBGCLAIMCLR_EL1; 1395 } 1396 break; 1397 case 14: 1398 switch (op2) { 1399 case 6: 1400 return MISCREG_DBGAUTHSTATUS_EL1; 1401 } 1402 break; 1403 } 1404 break; 1405 } 1406 break; 1407 } 1408 break; 1409 case 3: 1410 switch (crn) { 1411 case 0: 1412 switch (op1) { 1413 case 0: 1414 switch (crm) { 1415 case 0: 1416 switch (op2) { 1417 case 0: 1418 return MISCREG_MIDR_EL1; 1419 case 5: 1420 return MISCREG_MPIDR_EL1; 1421 case 6: 1422 return MISCREG_REVIDR_EL1; 1423 } 1424 break; 1425 case 1: 1426 switch (op2) { 1427 case 0: 1428 return MISCREG_ID_PFR0_EL1; 1429 case 1: 1430 return MISCREG_ID_PFR1_EL1; 1431 case 2: 1432 return MISCREG_ID_DFR0_EL1; 1433 case 3: 1434 return MISCREG_ID_AFR0_EL1; 1435 case 4: 1436 return MISCREG_ID_MMFR0_EL1; 1437 case 5: 1438 return MISCREG_ID_MMFR1_EL1; 1439 case 6: 1440 return MISCREG_ID_MMFR2_EL1; 1441 case 7: 1442 return MISCREG_ID_MMFR3_EL1; 1443 } 1444 break; 1445 case 2: 1446 switch (op2) { 1447 case 0: 1448 return MISCREG_ID_ISAR0_EL1; 1449 case 1: 1450 return MISCREG_ID_ISAR1_EL1; 1451 case 2: 1452 return MISCREG_ID_ISAR2_EL1; 1453 case 3: 1454 return MISCREG_ID_ISAR3_EL1; 1455 case 4: 1456 return MISCREG_ID_ISAR4_EL1; 1457 case 5: 1458 return MISCREG_ID_ISAR5_EL1; 1459 } 1460 break; 1461 case 3: 1462 switch (op2) { 1463 case 0: 1464 return MISCREG_MVFR0_EL1; 1465 case 1: 1466 return MISCREG_MVFR1_EL1; 1467 case 2: 1468 return MISCREG_MVFR2_EL1; 1469 case 3 ... 7: 1470 return MISCREG_RAZ; 1471 } 1472 break; 1473 case 4: 1474 switch (op2) { 1475 case 0: 1476 return MISCREG_ID_AA64PFR0_EL1; 1477 case 1: 1478 return MISCREG_ID_AA64PFR1_EL1; 1479 case 2 ... 7: 1480 return MISCREG_RAZ; 1481 } 1482 break; 1483 case 5: 1484 switch (op2) { 1485 case 0: 1486 return MISCREG_ID_AA64DFR0_EL1; 1487 case 1: 1488 return MISCREG_ID_AA64DFR1_EL1; 1489 case 4: 1490 return MISCREG_ID_AA64AFR0_EL1; 1491 case 5: 1492 return MISCREG_ID_AA64AFR1_EL1; 1493 case 2: 1494 case 3: 1495 case 6: 1496 case 7: 1497 return MISCREG_RAZ; 1498 } 1499 break; 1500 case 6: 1501 switch (op2) { 1502 case 0: 1503 return MISCREG_ID_AA64ISAR0_EL1; 1504 case 1: 1505 return MISCREG_ID_AA64ISAR1_EL1; 1506 case 2 ... 7: 1507 return MISCREG_RAZ; 1508 } 1509 break; 1510 case 7: 1511 switch (op2) { 1512 case 0: 1513 return MISCREG_ID_AA64MMFR0_EL1; 1514 case 1: 1515 return MISCREG_ID_AA64MMFR1_EL1; 1516 case 2 ... 7: 1517 return MISCREG_RAZ; 1518 } 1519 break; 1520 } 1521 break; 1522 case 1: 1523 switch (crm) { 1524 case 0: 1525 switch (op2) { 1526 case 0: 1527 return MISCREG_CCSIDR_EL1; 1528 case 1: 1529 return MISCREG_CLIDR_EL1; 1530 case 7: 1531 return MISCREG_AIDR_EL1; 1532 } 1533 break; 1534 } 1535 break; 1536 case 2: 1537 switch (crm) { 1538 case 0: 1539 switch (op2) { 1540 case 0: 1541 return MISCREG_CSSELR_EL1; 1542 } 1543 break; 1544 } 1545 break; 1546 case 3: 1547 switch (crm) { 1548 case 0: 1549 switch (op2) { 1550 case 1: 1551 return MISCREG_CTR_EL0; 1552 case 7: 1553 return MISCREG_DCZID_EL0; 1554 } 1555 break; 1556 } 1557 break; 1558 case 4: 1559 switch (crm) { 1560 case 0: 1561 switch (op2) { 1562 case 0: 1563 return MISCREG_VPIDR_EL2; 1564 case 5: 1565 return MISCREG_VMPIDR_EL2; 1566 } 1567 break; 1568 } 1569 break; 1570 } 1571 break; 1572 case 1: 1573 switch (op1) { 1574 case 0: 1575 switch (crm) { 1576 case 0: 1577 switch (op2) { 1578 case 0: 1579 return MISCREG_SCTLR_EL1; 1580 case 1: 1581 return MISCREG_ACTLR_EL1; 1582 case 2: 1583 return MISCREG_CPACR_EL1; 1584 } 1585 break; 1586 } 1587 break; 1588 case 4: 1589 switch (crm) { 1590 case 0: 1591 switch (op2) { 1592 case 0: 1593 return MISCREG_SCTLR_EL2; 1594 case 1: 1595 return MISCREG_ACTLR_EL2; 1596 } 1597 break; 1598 case 1: 1599 switch (op2) { 1600 case 0: 1601 return MISCREG_HCR_EL2; 1602 case 1: 1603 return MISCREG_MDCR_EL2; 1604 case 2: 1605 return MISCREG_CPTR_EL2; 1606 case 3: 1607 return MISCREG_HSTR_EL2; 1608 case 7: 1609 return MISCREG_HACR_EL2; 1610 } 1611 break; 1612 } 1613 break; 1614 case 6: 1615 switch (crm) { 1616 case 0: 1617 switch (op2) { 1618 case 0: 1619 return MISCREG_SCTLR_EL3; 1620 case 1: 1621 return MISCREG_ACTLR_EL3; 1622 } 1623 break; 1624 case 1: 1625 switch (op2) { 1626 case 0: 1627 return MISCREG_SCR_EL3; 1628 case 1: 1629 return MISCREG_SDER32_EL3; 1630 case 2: 1631 return MISCREG_CPTR_EL3; 1632 } 1633 break; 1634 case 3: 1635 switch (op2) { 1636 case 1: 1637 return MISCREG_MDCR_EL3; 1638 } 1639 break; 1640 } 1641 break; 1642 } 1643 break; 1644 case 2: 1645 switch (op1) { 1646 case 0: 1647 switch (crm) { 1648 case 0: 1649 switch (op2) { 1650 case 0: 1651 return MISCREG_TTBR0_EL1; 1652 case 1: 1653 return MISCREG_TTBR1_EL1; 1654 case 2: 1655 return MISCREG_TCR_EL1; 1656 } 1657 break; 1658 } 1659 break; 1660 case 4: 1661 switch (crm) { 1662 case 0: 1663 switch (op2) { 1664 case 0: 1665 return MISCREG_TTBR0_EL2; 1666 case 2: 1667 return MISCREG_TCR_EL2; 1668 } 1669 break; 1670 case 1: 1671 switch (op2) { 1672 case 0: 1673 return MISCREG_VTTBR_EL2; 1674 case 2: 1675 return MISCREG_VTCR_EL2; 1676 } 1677 break; 1678 } 1679 break; 1680 case 6: 1681 switch (crm) { 1682 case 0: 1683 switch (op2) { 1684 case 0: 1685 return MISCREG_TTBR0_EL3; 1686 case 2: 1687 return MISCREG_TCR_EL3; 1688 } 1689 break; 1690 } 1691 break; 1692 } 1693 break; 1694 case 3: 1695 switch (op1) { 1696 case 4: 1697 switch (crm) { 1698 case 0: 1699 switch (op2) { 1700 case 0: 1701 return MISCREG_DACR32_EL2; 1702 } 1703 break; 1704 } 1705 break; 1706 } 1707 break; 1708 case 4: 1709 switch (op1) { 1710 case 0: 1711 switch (crm) { 1712 case 0: 1713 switch (op2) { 1714 case 0: 1715 return MISCREG_SPSR_EL1; 1716 case 1: 1717 return MISCREG_ELR_EL1; 1718 } 1719 break; 1720 case 1: 1721 switch (op2) { 1722 case 0: 1723 return MISCREG_SP_EL0; 1724 } 1725 break; 1726 case 2: 1727 switch (op2) { 1728 case 0: 1729 return MISCREG_SPSEL; 1730 case 2: 1731 return MISCREG_CURRENTEL; 1732 } 1733 break; 1734 } 1735 break; 1736 case 3: 1737 switch (crm) { 1738 case 2: 1739 switch (op2) { 1740 case 0: 1741 return MISCREG_NZCV; 1742 case 1: 1743 return MISCREG_DAIF; 1744 } 1745 break; 1746 case 4: 1747 switch (op2) { 1748 case 0: 1749 return MISCREG_FPCR; 1750 case 1: 1751 return MISCREG_FPSR; 1752 } 1753 break; 1754 case 5: 1755 switch (op2) { 1756 case 0: 1757 return MISCREG_DSPSR_EL0; 1758 case 1: 1759 return MISCREG_DLR_EL0; 1760 } 1761 break; 1762 } 1763 break; 1764 case 4: 1765 switch (crm) { 1766 case 0: 1767 switch (op2) { 1768 case 0: 1769 return MISCREG_SPSR_EL2; 1770 case 1: 1771 return MISCREG_ELR_EL2; 1772 } 1773 break; 1774 case 1: 1775 switch (op2) { 1776 case 0: 1777 return MISCREG_SP_EL1; 1778 } 1779 break; 1780 case 3: 1781 switch (op2) { 1782 case 0: 1783 return MISCREG_SPSR_IRQ_AA64; 1784 case 1: 1785 return MISCREG_SPSR_ABT_AA64; 1786 case 2: 1787 return MISCREG_SPSR_UND_AA64; 1788 case 3: 1789 return MISCREG_SPSR_FIQ_AA64; 1790 } 1791 break; 1792 } 1793 break; 1794 case 6: 1795 switch (crm) { 1796 case 0: 1797 switch (op2) { 1798 case 0: 1799 return MISCREG_SPSR_EL3; 1800 case 1: 1801 return MISCREG_ELR_EL3; 1802 } 1803 break; 1804 case 1: 1805 switch (op2) { 1806 case 0: 1807 return MISCREG_SP_EL2; 1808 } 1809 break; 1810 } 1811 break; 1812 } 1813 break; 1814 case 5: 1815 switch (op1) { 1816 case 0: 1817 switch (crm) { 1818 case 1: 1819 switch (op2) { 1820 case 0: 1821 return MISCREG_AFSR0_EL1; 1822 case 1: 1823 return MISCREG_AFSR1_EL1; 1824 } 1825 break; 1826 case 2: 1827 switch (op2) { 1828 case 0: 1829 return MISCREG_ESR_EL1; 1830 } 1831 break; 1832 } 1833 break; 1834 case 4: 1835 switch (crm) { 1836 case 0: 1837 switch (op2) { 1838 case 1: 1839 return MISCREG_IFSR32_EL2; 1840 } 1841 break; 1842 case 1: 1843 switch (op2) { 1844 case 0: 1845 return MISCREG_AFSR0_EL2; 1846 case 1: 1847 return MISCREG_AFSR1_EL2; 1848 } 1849 break; 1850 case 2: 1851 switch (op2) { 1852 case 0: 1853 return MISCREG_ESR_EL2; 1854 } 1855 break; 1856 case 3: 1857 switch (op2) { 1858 case 0: 1859 return MISCREG_FPEXC32_EL2; 1860 } 1861 break; 1862 } 1863 break; 1864 case 6: 1865 switch (crm) { 1866 case 1: 1867 switch (op2) { 1868 case 0: 1869 return MISCREG_AFSR0_EL3; 1870 case 1: 1871 return MISCREG_AFSR1_EL3; 1872 } 1873 break; 1874 case 2: 1875 switch (op2) { 1876 case 0: 1877 return MISCREG_ESR_EL3; 1878 } 1879 break; 1880 } 1881 break; 1882 } 1883 break; 1884 case 6: 1885 switch (op1) { 1886 case 0: 1887 switch (crm) { 1888 case 0: 1889 switch (op2) { 1890 case 0: 1891 return MISCREG_FAR_EL1; 1892 } 1893 break; 1894 } 1895 break; 1896 case 4: 1897 switch (crm) { 1898 case 0: 1899 switch (op2) { 1900 case 0: 1901 return MISCREG_FAR_EL2; 1902 case 4: 1903 return MISCREG_HPFAR_EL2; 1904 } 1905 break; 1906 } 1907 break; 1908 case 6: 1909 switch (crm) { 1910 case 0: 1911 switch (op2) { 1912 case 0: 1913 return MISCREG_FAR_EL3; 1914 } 1915 break; 1916 } 1917 break; 1918 } 1919 break; 1920 case 7: 1921 switch (op1) { 1922 case 0: 1923 switch (crm) { 1924 case 4: 1925 switch (op2) { 1926 case 0: 1927 return MISCREG_PAR_EL1; 1928 } 1929 break; 1930 } 1931 break; 1932 } 1933 break; 1934 case 9: 1935 switch (op1) { 1936 case 0: 1937 switch (crm) { 1938 case 14: 1939 switch (op2) { 1940 case 1: 1941 return MISCREG_PMINTENSET_EL1; 1942 case 2: 1943 return MISCREG_PMINTENCLR_EL1; 1944 } 1945 break; 1946 } 1947 break; 1948 case 3: 1949 switch (crm) { 1950 case 12: 1951 switch (op2) { 1952 case 0: 1953 return MISCREG_PMCR_EL0; 1954 case 1: 1955 return MISCREG_PMCNTENSET_EL0; 1956 case 2: 1957 return MISCREG_PMCNTENCLR_EL0; 1958 case 3: 1959 return MISCREG_PMOVSCLR_EL0; 1960 case 4: 1961 return MISCREG_PMSWINC_EL0; 1962 case 5: 1963 return MISCREG_PMSELR_EL0; 1964 case 6: 1965 return MISCREG_PMCEID0_EL0; 1966 case 7: 1967 return MISCREG_PMCEID1_EL0; 1968 } 1969 break; 1970 case 13: 1971 switch (op2) { 1972 case 0: 1973 return MISCREG_PMCCNTR_EL0; 1974 case 1: 1975 return MISCREG_PMXEVTYPER_EL0; 1976 case 2: 1977 return MISCREG_PMXEVCNTR_EL0; 1978 } 1979 break; 1980 case 14: 1981 switch (op2) { 1982 case 0: 1983 return MISCREG_PMUSERENR_EL0; 1984 case 3: 1985 return MISCREG_PMOVSSET_EL0; 1986 } 1987 break; 1988 } 1989 break; 1990 } 1991 break; 1992 case 10: 1993 switch (op1) { 1994 case 0: 1995 switch (crm) { 1996 case 2: 1997 switch (op2) { 1998 case 0: 1999 return MISCREG_MAIR_EL1; 2000 } 2001 break; 2002 case 3: 2003 switch (op2) { 2004 case 0: 2005 return MISCREG_AMAIR_EL1; 2006 } 2007 break; 2008 } 2009 break; 2010 case 4: 2011 switch (crm) { 2012 case 2: 2013 switch (op2) { 2014 case 0: 2015 return MISCREG_MAIR_EL2; 2016 } 2017 break; 2018 case 3: 2019 switch (op2) { 2020 case 0: 2021 return MISCREG_AMAIR_EL2; 2022 } 2023 break; 2024 } 2025 break; 2026 case 6: 2027 switch (crm) { 2028 case 2: 2029 switch (op2) { 2030 case 0: 2031 return MISCREG_MAIR_EL3; 2032 } 2033 break; 2034 case 3: 2035 switch (op2) { 2036 case 0: 2037 return MISCREG_AMAIR_EL3; 2038 } 2039 break; 2040 } 2041 break; 2042 } 2043 break; 2044 case 11: 2045 switch (op1) { 2046 case 1: 2047 switch (crm) { 2048 case 0: 2049 switch (op2) { 2050 case 2: 2051 return MISCREG_L2CTLR_EL1; 2052 case 3: 2053 return MISCREG_L2ECTLR_EL1; 2054 } 2055 break; 2056 } 2057 break; 2058 } 2059 break; 2060 case 12: 2061 switch (op1) { 2062 case 0: 2063 switch (crm) { 2064 case 0: 2065 switch (op2) { 2066 case 0: 2067 return MISCREG_VBAR_EL1; 2068 case 1: 2069 return MISCREG_RVBAR_EL1; 2070 } 2071 break; 2072 case 1: 2073 switch (op2) { 2074 case 0: 2075 return MISCREG_ISR_EL1; 2076 } 2077 break; 2078 } 2079 break; 2080 case 4: 2081 switch (crm) { 2082 case 0: 2083 switch (op2) { 2084 case 0: 2085 return MISCREG_VBAR_EL2; 2086 case 1: 2087 return MISCREG_RVBAR_EL2; 2088 } 2089 break; 2090 } 2091 break; 2092 case 6: 2093 switch (crm) { 2094 case 0: 2095 switch (op2) { 2096 case 0: 2097 return MISCREG_VBAR_EL3; 2098 case 1: 2099 return MISCREG_RVBAR_EL3; 2100 case 2: 2101 return MISCREG_RMR_EL3; 2102 } 2103 break; 2104 } 2105 break; 2106 } 2107 break; 2108 case 13: 2109 switch (op1) { 2110 case 0: 2111 switch (crm) { 2112 case 0: 2113 switch (op2) { 2114 case 1: 2115 return MISCREG_CONTEXTIDR_EL1; 2116 case 4: 2117 return MISCREG_TPIDR_EL1; 2118 } 2119 break; 2120 } 2121 break; 2122 case 3: 2123 switch (crm) { 2124 case 0: 2125 switch (op2) { 2126 case 2: 2127 return MISCREG_TPIDR_EL0; 2128 case 3: 2129 return MISCREG_TPIDRRO_EL0; 2130 } 2131 break; 2132 } 2133 break; 2134 case 4: 2135 switch (crm) { 2136 case 0: 2137 switch (op2) { 2138 case 1: 2139 return MISCREG_CONTEXTIDR_EL2; 2140 case 2: 2141 return MISCREG_TPIDR_EL2; 2142 } 2143 break; 2144 } 2145 break; 2146 case 6: 2147 switch (crm) { 2148 case 0: 2149 switch (op2) { 2150 case 2: 2151 return MISCREG_TPIDR_EL3; 2152 } 2153 break; 2154 } 2155 break; 2156 } 2157 break; 2158 case 14: 2159 switch (op1) { 2160 case 0: 2161 switch (crm) { 2162 case 1: 2163 switch (op2) { 2164 case 0: 2165 return MISCREG_CNTKCTL_EL1; 2166 } 2167 break; 2168 } 2169 break; 2170 case 3: 2171 switch (crm) { 2172 case 0: 2173 switch (op2) { 2174 case 0: 2175 return MISCREG_CNTFRQ_EL0; 2176 case 1: 2177 return MISCREG_CNTPCT_EL0; 2178 case 2: 2179 return MISCREG_CNTVCT_EL0; 2180 } 2181 break; 2182 case 2: 2183 switch (op2) { 2184 case 0: 2185 return MISCREG_CNTP_TVAL_EL0; 2186 case 1: 2187 return MISCREG_CNTP_CTL_EL0; 2188 case 2: 2189 return MISCREG_CNTP_CVAL_EL0; 2190 } 2191 break; 2192 case 3: 2193 switch (op2) { 2194 case 0: 2195 return MISCREG_CNTV_TVAL_EL0; 2196 case 1: 2197 return MISCREG_CNTV_CTL_EL0; 2198 case 2: 2199 return MISCREG_CNTV_CVAL_EL0; 2200 } 2201 break; 2202 case 8: 2203 switch (op2) { 2204 case 0: 2205 return MISCREG_PMEVCNTR0_EL0; 2206 case 1: 2207 return MISCREG_PMEVCNTR1_EL0; 2208 case 2: 2209 return MISCREG_PMEVCNTR2_EL0; 2210 case 3: 2211 return MISCREG_PMEVCNTR3_EL0; 2212 case 4: 2213 return MISCREG_PMEVCNTR4_EL0; 2214 case 5: 2215 return MISCREG_PMEVCNTR5_EL0; 2216 } 2217 break; 2218 case 12: 2219 switch (op2) { 2220 case 0: 2221 return MISCREG_PMEVTYPER0_EL0; 2222 case 1: 2223 return MISCREG_PMEVTYPER1_EL0; 2224 case 2: 2225 return MISCREG_PMEVTYPER2_EL0; 2226 case 3: 2227 return MISCREG_PMEVTYPER3_EL0; 2228 case 4: 2229 return MISCREG_PMEVTYPER4_EL0; 2230 case 5: 2231 return MISCREG_PMEVTYPER5_EL0; 2232 } 2233 break; 2234 case 15: 2235 switch (op2) { 2236 case 7: 2237 return MISCREG_PMCCFILTR_EL0; 2238 } 2239 } 2240 break; 2241 case 4: 2242 switch (crm) { 2243 case 0: 2244 switch (op2) { 2245 case 3: 2246 return MISCREG_CNTVOFF_EL2; 2247 } 2248 break; 2249 case 1: 2250 switch (op2) { 2251 case 0: 2252 return MISCREG_CNTHCTL_EL2; 2253 } 2254 break; 2255 case 2: 2256 switch (op2) { 2257 case 0: 2258 return MISCREG_CNTHP_TVAL_EL2; 2259 case 1: 2260 return MISCREG_CNTHP_CTL_EL2; 2261 case 2: 2262 return MISCREG_CNTHP_CVAL_EL2; 2263 } 2264 break; 2265 } 2266 break; 2267 case 7: 2268 switch (crm) { 2269 case 2: 2270 switch (op2) { 2271 case 0: 2272 return MISCREG_CNTPS_TVAL_EL1; 2273 case 1: 2274 return MISCREG_CNTPS_CTL_EL1; 2275 case 2: 2276 return MISCREG_CNTPS_CVAL_EL1; 2277 } 2278 break; 2279 } 2280 break; 2281 } 2282 break; 2283 case 15: 2284 switch (op1) { 2285 case 0: 2286 switch (crm) { 2287 case 0: 2288 switch (op2) { 2289 case 0: 2290 return MISCREG_IL1DATA0_EL1; 2291 case 1: 2292 return MISCREG_IL1DATA1_EL1; 2293 case 2: 2294 return MISCREG_IL1DATA2_EL1; 2295 case 3: 2296 return MISCREG_IL1DATA3_EL1; 2297 } 2298 break; 2299 case 1: 2300 switch (op2) { 2301 case 0: 2302 return MISCREG_DL1DATA0_EL1; 2303 case 1: 2304 return MISCREG_DL1DATA1_EL1; 2305 case 2: 2306 return MISCREG_DL1DATA2_EL1; 2307 case 3: 2308 return MISCREG_DL1DATA3_EL1; 2309 case 4: 2310 return MISCREG_DL1DATA4_EL1; 2311 } 2312 break; 2313 } 2314 break; 2315 case 1: 2316 switch (crm) { 2317 case 0: 2318 switch (op2) { 2319 case 0: 2320 return MISCREG_L2ACTLR_EL1; 2321 } 2322 break; 2323 case 2: 2324 switch (op2) { 2325 case 0: 2326 return MISCREG_CPUACTLR_EL1; 2327 case 1: 2328 return MISCREG_CPUECTLR_EL1; 2329 case 2: 2330 return MISCREG_CPUMERRSR_EL1; 2331 case 3: 2332 return MISCREG_L2MERRSR_EL1; 2333 } 2334 break; 2335 case 3: 2336 switch (op2) { 2337 case 0: 2338 return MISCREG_CBAR_EL1; 2339 2340 } 2341 break; 2342 } 2343 break; 2344 } 2345 break; 2346 } 2347 break; 2348 } 2349 2350 return MISCREG_UNKNOWN; 2351} 2352 2353bitset<NUM_MISCREG_INFOS> miscRegInfo[NUM_MISCREGS]; // initialized below 2354 2355void 2356ISA::initializeMiscRegMetadata() 2357{ 2358 // the MiscReg metadata tables are shared across all instances of the 2359 // ISA object, so there's no need to initialize them multiple times. 2360 static bool completed = false; 2361 if (completed) 2362 return; 2363 2364 /** 2365 * Some registers alias with others, and therefore need to be translated. 2366 * When two mapping registers are given, they are the 32b lower and 2367 * upper halves, respectively, of the 64b register being mapped. 2368 * aligned with reference documentation ARM DDI 0487A.i pp 1540-1543 2369 * 2370 * NAM = "not architecturally mandated", 2371 * from ARM DDI 0487A.i, template text 2372 * "AArch64 System register ___ can be mapped to 2373 * AArch32 System register ___, but this is not 2374 * architecturally mandated." 2375 */ 2376 2377 InitReg(MISCREG_CPSR) 2378 .allPrivileges(); 2379 InitReg(MISCREG_SPSR) 2380 .allPrivileges(); 2381 InitReg(MISCREG_SPSR_FIQ) 2382 .allPrivileges(); 2383 InitReg(MISCREG_SPSR_IRQ) 2384 .allPrivileges(); 2385 InitReg(MISCREG_SPSR_SVC) 2386 .allPrivileges(); 2387 InitReg(MISCREG_SPSR_MON) 2388 .allPrivileges(); 2389 InitReg(MISCREG_SPSR_ABT) 2390 .allPrivileges(); 2391 InitReg(MISCREG_SPSR_HYP) 2392 .allPrivileges(); 2393 InitReg(MISCREG_SPSR_UND) 2394 .allPrivileges(); 2395 InitReg(MISCREG_ELR_HYP) 2396 .allPrivileges(); 2397 InitReg(MISCREG_FPSID) 2398 .allPrivileges(); 2399 InitReg(MISCREG_FPSCR) 2400 .allPrivileges(); 2401 InitReg(MISCREG_MVFR1) 2402 .allPrivileges(); 2403 InitReg(MISCREG_MVFR0) 2404 .allPrivileges(); 2405 InitReg(MISCREG_FPEXC) 2406 .allPrivileges(); 2407 2408 // Helper registers 2409 InitReg(MISCREG_CPSR_MODE) 2410 .allPrivileges(); 2411 InitReg(MISCREG_CPSR_Q) 2412 .allPrivileges(); 2413 InitReg(MISCREG_FPSCR_EXC) 2414 .allPrivileges(); 2415 InitReg(MISCREG_FPSCR_QC) 2416 .allPrivileges(); 2417 InitReg(MISCREG_LOCKADDR) 2418 .allPrivileges(); 2419 InitReg(MISCREG_LOCKFLAG) 2420 .allPrivileges(); 2421 InitReg(MISCREG_PRRR_MAIR0) 2422 .mutex() 2423 .banked(); 2424 InitReg(MISCREG_PRRR_MAIR0_NS) 2425 .mutex() 2426 .bankedChild(); 2427 InitReg(MISCREG_PRRR_MAIR0_S) 2428 .mutex() 2429 .bankedChild(); 2430 InitReg(MISCREG_NMRR_MAIR1) 2431 .mutex() 2432 .banked(); 2433 InitReg(MISCREG_NMRR_MAIR1_NS) 2434 .mutex() 2435 .bankedChild(); 2436 InitReg(MISCREG_NMRR_MAIR1_S) 2437 .mutex() 2438 .bankedChild(); 2439 InitReg(MISCREG_PMXEVTYPER_PMCCFILTR) 2440 .mutex(); 2441 InitReg(MISCREG_SCTLR_RST) 2442 .allPrivileges(); 2443 InitReg(MISCREG_SEV_MAILBOX) 2444 .allPrivileges(); 2445 2446 // AArch32 CP14 registers 2447 InitReg(MISCREG_DBGDIDR) 2448 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); 2449 InitReg(MISCREG_DBGDSCRint) 2450 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); 2451 InitReg(MISCREG_DBGDCCINT) 2452 .unimplemented() 2453 .allPrivileges(); 2454 InitReg(MISCREG_DBGDTRTXint) 2455 .unimplemented() 2456 .allPrivileges(); 2457 InitReg(MISCREG_DBGDTRRXint) 2458 .unimplemented() 2459 .allPrivileges(); 2460 InitReg(MISCREG_DBGWFAR) 2461 .unimplemented() 2462 .allPrivileges(); 2463 InitReg(MISCREG_DBGVCR) 2464 .unimplemented() 2465 .allPrivileges(); 2466 InitReg(MISCREG_DBGDTRRXext) 2467 .unimplemented() 2468 .allPrivileges(); 2469 InitReg(MISCREG_DBGDSCRext) 2470 .unimplemented() 2471 .warnNotFail() 2472 .allPrivileges(); 2473 InitReg(MISCREG_DBGDTRTXext) 2474 .unimplemented() 2475 .allPrivileges(); 2476 InitReg(MISCREG_DBGOSECCR) 2477 .unimplemented() 2478 .allPrivileges(); 2479 InitReg(MISCREG_DBGBVR0) 2480 .unimplemented() 2481 .allPrivileges(); 2482 InitReg(MISCREG_DBGBVR1) 2483 .unimplemented() 2484 .allPrivileges(); 2485 InitReg(MISCREG_DBGBVR2) 2486 .unimplemented() 2487 .allPrivileges(); 2488 InitReg(MISCREG_DBGBVR3) 2489 .unimplemented() 2490 .allPrivileges(); 2491 InitReg(MISCREG_DBGBVR4) 2492 .unimplemented() 2493 .allPrivileges(); 2494 InitReg(MISCREG_DBGBVR5) 2495 .unimplemented() 2496 .allPrivileges(); 2497 InitReg(MISCREG_DBGBCR0) 2498 .unimplemented() 2499 .allPrivileges(); 2500 InitReg(MISCREG_DBGBCR1) 2501 .unimplemented() 2502 .allPrivileges(); 2503 InitReg(MISCREG_DBGBCR2) 2504 .unimplemented() 2505 .allPrivileges(); 2506 InitReg(MISCREG_DBGBCR3) 2507 .unimplemented() 2508 .allPrivileges(); 2509 InitReg(MISCREG_DBGBCR4) 2510 .unimplemented() 2511 .allPrivileges(); 2512 InitReg(MISCREG_DBGBCR5) 2513 .unimplemented() 2514 .allPrivileges(); 2515 InitReg(MISCREG_DBGWVR0) 2516 .unimplemented() 2517 .allPrivileges(); 2518 InitReg(MISCREG_DBGWVR1) 2519 .unimplemented() 2520 .allPrivileges(); 2521 InitReg(MISCREG_DBGWVR2) 2522 .unimplemented() 2523 .allPrivileges(); 2524 InitReg(MISCREG_DBGWVR3) 2525 .unimplemented() 2526 .allPrivileges(); 2527 InitReg(MISCREG_DBGWCR0) 2528 .unimplemented() 2529 .allPrivileges(); 2530 InitReg(MISCREG_DBGWCR1) 2531 .unimplemented() 2532 .allPrivileges(); 2533 InitReg(MISCREG_DBGWCR2) 2534 .unimplemented() 2535 .allPrivileges(); 2536 InitReg(MISCREG_DBGWCR3) 2537 .unimplemented() 2538 .allPrivileges(); 2539 InitReg(MISCREG_DBGDRAR) 2540 .unimplemented() 2541 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); 2542 InitReg(MISCREG_DBGBXVR4) 2543 .unimplemented() 2544 .allPrivileges(); 2545 InitReg(MISCREG_DBGBXVR5) 2546 .unimplemented() 2547 .allPrivileges(); 2548 InitReg(MISCREG_DBGOSLAR) 2549 .unimplemented() 2550 .allPrivileges().monSecureRead(0).monNonSecureRead(0); 2551 InitReg(MISCREG_DBGOSLSR) 2552 .unimplemented() 2553 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); 2554 InitReg(MISCREG_DBGOSDLR) 2555 .unimplemented() 2556 .allPrivileges(); 2557 InitReg(MISCREG_DBGPRCR) 2558 .unimplemented() 2559 .allPrivileges(); 2560 InitReg(MISCREG_DBGDSAR) 2561 .unimplemented() 2562 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); 2563 InitReg(MISCREG_DBGCLAIMSET) 2564 .unimplemented() 2565 .allPrivileges(); 2566 InitReg(MISCREG_DBGCLAIMCLR) 2567 .unimplemented() 2568 .allPrivileges(); 2569 InitReg(MISCREG_DBGAUTHSTATUS) 2570 .unimplemented() 2571 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); 2572 InitReg(MISCREG_DBGDEVID2) 2573 .unimplemented() 2574 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); 2575 InitReg(MISCREG_DBGDEVID1) 2576 .unimplemented() 2577 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); 2578 InitReg(MISCREG_DBGDEVID0) 2579 .unimplemented() 2580 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0); 2581 InitReg(MISCREG_TEECR) 2582 .unimplemented() 2583 .allPrivileges(); 2584 InitReg(MISCREG_JIDR) 2585 .allPrivileges(); 2586 InitReg(MISCREG_TEEHBR) 2587 .allPrivileges(); 2588 InitReg(MISCREG_JOSCR) 2589 .allPrivileges(); 2590 InitReg(MISCREG_JMCR) 2591 .allPrivileges(); 2592 2593 // AArch32 CP15 registers 2594 InitReg(MISCREG_MIDR) 2595 .allPrivileges().exceptUserMode().writes(0); 2596 InitReg(MISCREG_CTR) 2597 .allPrivileges().exceptUserMode().writes(0); 2598 InitReg(MISCREG_TCMTR) 2599 .allPrivileges().exceptUserMode().writes(0); 2600 InitReg(MISCREG_TLBTR) 2601 .allPrivileges().exceptUserMode().writes(0); 2602 InitReg(MISCREG_MPIDR) 2603 .allPrivileges().exceptUserMode().writes(0); 2604 InitReg(MISCREG_REVIDR) 2605 .unimplemented() 2606 .warnNotFail() 2607 .allPrivileges().exceptUserMode().writes(0); 2608 InitReg(MISCREG_ID_PFR0) 2609 .allPrivileges().exceptUserMode().writes(0); 2610 InitReg(MISCREG_ID_PFR1) 2611 .allPrivileges().exceptUserMode().writes(0); 2612 InitReg(MISCREG_ID_DFR0) 2613 .allPrivileges().exceptUserMode().writes(0); 2614 InitReg(MISCREG_ID_AFR0) 2615 .allPrivileges().exceptUserMode().writes(0); 2616 InitReg(MISCREG_ID_MMFR0) 2617 .allPrivileges().exceptUserMode().writes(0); 2618 InitReg(MISCREG_ID_MMFR1) 2619 .allPrivileges().exceptUserMode().writes(0); 2620 InitReg(MISCREG_ID_MMFR2) 2621 .allPrivileges().exceptUserMode().writes(0); 2622 InitReg(MISCREG_ID_MMFR3) 2623 .allPrivileges().exceptUserMode().writes(0); 2624 InitReg(MISCREG_ID_ISAR0) 2625 .allPrivileges().exceptUserMode().writes(0); 2626 InitReg(MISCREG_ID_ISAR1) 2627 .allPrivileges().exceptUserMode().writes(0); 2628 InitReg(MISCREG_ID_ISAR2) 2629 .allPrivileges().exceptUserMode().writes(0); 2630 InitReg(MISCREG_ID_ISAR3) 2631 .allPrivileges().exceptUserMode().writes(0); 2632 InitReg(MISCREG_ID_ISAR4) 2633 .allPrivileges().exceptUserMode().writes(0); 2634 InitReg(MISCREG_ID_ISAR5) 2635 .allPrivileges().exceptUserMode().writes(0); 2636 InitReg(MISCREG_CCSIDR) 2637 .allPrivileges().exceptUserMode().writes(0); 2638 InitReg(MISCREG_CLIDR) 2639 .allPrivileges().exceptUserMode().writes(0); 2640 InitReg(MISCREG_AIDR) 2641 .allPrivileges().exceptUserMode().writes(0); 2642 InitReg(MISCREG_CSSELR) 2643 .banked(); 2644 InitReg(MISCREG_CSSELR_NS) 2645 .bankedChild() 2646 .nonSecure().exceptUserMode(); 2647 InitReg(MISCREG_CSSELR_S) 2648 .bankedChild() 2649 .secure().exceptUserMode(); 2650 InitReg(MISCREG_VPIDR) 2651 .hyp().monNonSecure(); 2652 InitReg(MISCREG_VMPIDR) 2653 .hyp().monNonSecure(); 2654 InitReg(MISCREG_SCTLR) 2655 .banked(); 2656 InitReg(MISCREG_SCTLR_NS) 2657 .bankedChild() 2658 .nonSecure().exceptUserMode(); 2659 InitReg(MISCREG_SCTLR_S) 2660 .bankedChild() 2661 .secure().exceptUserMode(); 2662 InitReg(MISCREG_ACTLR) 2663 .banked(); 2664 InitReg(MISCREG_ACTLR_NS) 2665 .bankedChild() 2666 .nonSecure().exceptUserMode(); 2667 InitReg(MISCREG_ACTLR_S) 2668 .bankedChild() 2669 .secure().exceptUserMode(); 2670 InitReg(MISCREG_CPACR) 2671 .allPrivileges().exceptUserMode(); 2672 InitReg(MISCREG_SCR) 2673 .mon().secure().exceptUserMode() 2674 .res0(0xff40) // [31:16], [6] 2675 .res1(0x0030); // [5:4] 2676 InitReg(MISCREG_SDER) 2677 .mon(); 2678 InitReg(MISCREG_NSACR) 2679 .allPrivileges().hypWrite(0).privNonSecureWrite(0).exceptUserMode(); 2680 InitReg(MISCREG_HSCTLR) 2681 .hyp().monNonSecure(); 2682 InitReg(MISCREG_HACTLR) 2683 .hyp().monNonSecure(); 2684 InitReg(MISCREG_HCR) 2685 .hyp().monNonSecure(); 2686 InitReg(MISCREG_HDCR) 2687 .hyp().monNonSecure(); 2688 InitReg(MISCREG_HCPTR) 2689 .hyp().monNonSecure(); 2690 InitReg(MISCREG_HSTR) 2691 .hyp().monNonSecure(); 2692 InitReg(MISCREG_HACR) 2693 .unimplemented() 2694 .warnNotFail() 2695 .hyp().monNonSecure(); 2696 InitReg(MISCREG_TTBR0) 2697 .banked(); 2698 InitReg(MISCREG_TTBR0_NS) 2699 .bankedChild() 2700 .nonSecure().exceptUserMode(); 2701 InitReg(MISCREG_TTBR0_S) 2702 .bankedChild() 2703 .secure().exceptUserMode(); 2704 InitReg(MISCREG_TTBR1) 2705 .banked(); 2706 InitReg(MISCREG_TTBR1_NS) 2707 .bankedChild() 2708 .nonSecure().exceptUserMode(); 2709 InitReg(MISCREG_TTBR1_S) 2710 .bankedChild() 2711 .secure().exceptUserMode(); 2712 InitReg(MISCREG_TTBCR) 2713 .banked(); 2714 InitReg(MISCREG_TTBCR_NS) 2715 .bankedChild() 2716 .nonSecure().exceptUserMode(); 2717 InitReg(MISCREG_TTBCR_S) 2718 .bankedChild() 2719 .secure().exceptUserMode(); 2720 InitReg(MISCREG_HTCR) 2721 .hyp().monNonSecure(); 2722 InitReg(MISCREG_VTCR) 2723 .hyp().monNonSecure(); 2724 InitReg(MISCREG_DACR) 2725 .banked(); 2726 InitReg(MISCREG_DACR_NS) 2727 .bankedChild() 2728 .nonSecure().exceptUserMode(); 2729 InitReg(MISCREG_DACR_S) 2730 .bankedChild() 2731 .secure().exceptUserMode(); 2732 InitReg(MISCREG_DFSR) 2733 .banked(); 2734 InitReg(MISCREG_DFSR_NS) 2735 .bankedChild() 2736 .nonSecure().exceptUserMode(); 2737 InitReg(MISCREG_DFSR_S) 2738 .bankedChild() 2739 .secure().exceptUserMode(); 2740 InitReg(MISCREG_IFSR) 2741 .banked(); 2742 InitReg(MISCREG_IFSR_NS) 2743 .bankedChild() 2744 .nonSecure().exceptUserMode(); 2745 InitReg(MISCREG_IFSR_S) 2746 .bankedChild() 2747 .secure().exceptUserMode(); 2748 InitReg(MISCREG_ADFSR) 2749 .unimplemented() 2750 .warnNotFail() 2751 .banked(); 2752 InitReg(MISCREG_ADFSR_NS) 2753 .unimplemented() 2754 .warnNotFail() 2755 .bankedChild() 2756 .nonSecure().exceptUserMode(); 2757 InitReg(MISCREG_ADFSR_S) 2758 .unimplemented() 2759 .warnNotFail() 2760 .bankedChild() 2761 .secure().exceptUserMode(); 2762 InitReg(MISCREG_AIFSR) 2763 .unimplemented() 2764 .warnNotFail() 2765 .banked(); 2766 InitReg(MISCREG_AIFSR_NS) 2767 .unimplemented() 2768 .warnNotFail() 2769 .bankedChild() 2770 .nonSecure().exceptUserMode(); 2771 InitReg(MISCREG_AIFSR_S) 2772 .unimplemented() 2773 .warnNotFail() 2774 .bankedChild() 2775 .secure().exceptUserMode(); 2776 InitReg(MISCREG_HADFSR) 2777 .hyp().monNonSecure(); 2778 InitReg(MISCREG_HAIFSR) 2779 .hyp().monNonSecure(); 2780 InitReg(MISCREG_HSR) 2781 .hyp().monNonSecure(); 2782 InitReg(MISCREG_DFAR) 2783 .banked(); 2784 InitReg(MISCREG_DFAR_NS) 2785 .bankedChild() 2786 .nonSecure().exceptUserMode(); 2787 InitReg(MISCREG_DFAR_S) 2788 .bankedChild() 2789 .secure().exceptUserMode(); 2790 InitReg(MISCREG_IFAR) 2791 .banked(); 2792 InitReg(MISCREG_IFAR_NS) 2793 .bankedChild() 2794 .nonSecure().exceptUserMode(); 2795 InitReg(MISCREG_IFAR_S) 2796 .bankedChild() 2797 .secure().exceptUserMode(); 2798 InitReg(MISCREG_HDFAR) 2799 .hyp().monNonSecure(); 2800 InitReg(MISCREG_HIFAR) 2801 .hyp().monNonSecure(); 2802 InitReg(MISCREG_HPFAR) 2803 .hyp().monNonSecure(); 2804 InitReg(MISCREG_ICIALLUIS) 2805 .unimplemented() 2806 .warnNotFail() 2807 .writes(1).exceptUserMode(); 2808 InitReg(MISCREG_BPIALLIS) 2809 .unimplemented() 2810 .warnNotFail() 2811 .writes(1).exceptUserMode(); 2812 InitReg(MISCREG_PAR) 2813 .banked(); 2814 InitReg(MISCREG_PAR_NS) 2815 .bankedChild() 2816 .nonSecure().exceptUserMode(); 2817 InitReg(MISCREG_PAR_S) 2818 .bankedChild() 2819 .secure().exceptUserMode(); 2820 InitReg(MISCREG_ICIALLU) 2821 .writes(1).exceptUserMode(); 2822 InitReg(MISCREG_ICIMVAU) 2823 .unimplemented() 2824 .warnNotFail() 2825 .writes(1).exceptUserMode(); 2826 InitReg(MISCREG_CP15ISB) 2827 .writes(1); 2828 InitReg(MISCREG_BPIALL) 2829 .unimplemented() 2830 .warnNotFail() 2831 .writes(1).exceptUserMode(); 2832 InitReg(MISCREG_BPIMVA) 2833 .unimplemented() 2834 .warnNotFail() 2835 .writes(1).exceptUserMode(); 2836 InitReg(MISCREG_DCIMVAC) 2837 .unimplemented() 2838 .warnNotFail() 2839 .writes(1).exceptUserMode(); 2840 InitReg(MISCREG_DCISW) 2841 .unimplemented() 2842 .warnNotFail() 2843 .writes(1).exceptUserMode(); 2844 InitReg(MISCREG_ATS1CPR) 2845 .writes(1).exceptUserMode(); 2846 InitReg(MISCREG_ATS1CPW) 2847 .writes(1).exceptUserMode(); 2848 InitReg(MISCREG_ATS1CUR) 2849 .writes(1).exceptUserMode(); 2850 InitReg(MISCREG_ATS1CUW) 2851 .writes(1).exceptUserMode(); 2852 InitReg(MISCREG_ATS12NSOPR) 2853 .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite(); 2854 InitReg(MISCREG_ATS12NSOPW) 2855 .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite(); 2856 InitReg(MISCREG_ATS12NSOUR) 2857 .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite(); 2858 InitReg(MISCREG_ATS12NSOUW) 2859 .privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite(); 2860 InitReg(MISCREG_DCCMVAC) 2861 .writes(1).exceptUserMode(); 2862 InitReg(MISCREG_DCCSW) 2863 .unimplemented() 2864 .warnNotFail() 2865 .writes(1).exceptUserMode(); 2866 InitReg(MISCREG_CP15DSB) 2867 .writes(1); 2868 InitReg(MISCREG_CP15DMB) 2869 .writes(1); 2870 InitReg(MISCREG_DCCMVAU) 2871 .unimplemented() 2872 .warnNotFail() 2873 .writes(1).exceptUserMode(); 2874 InitReg(MISCREG_DCCIMVAC) 2875 .unimplemented() 2876 .warnNotFail() 2877 .writes(1).exceptUserMode(); 2878 InitReg(MISCREG_DCCISW) 2879 .unimplemented() 2880 .warnNotFail() 2881 .writes(1).exceptUserMode(); 2882 InitReg(MISCREG_ATS1HR) 2883 .monNonSecureWrite().hypWrite(); 2884 InitReg(MISCREG_ATS1HW) 2885 .monNonSecureWrite().hypWrite(); 2886 InitReg(MISCREG_TLBIALLIS) 2887 .writes(1).exceptUserMode(); 2888 InitReg(MISCREG_TLBIMVAIS) 2889 .writes(1).exceptUserMode(); 2890 InitReg(MISCREG_TLBIASIDIS) 2891 .writes(1).exceptUserMode(); 2892 InitReg(MISCREG_TLBIMVAAIS) 2893 .writes(1).exceptUserMode(); 2894 InitReg(MISCREG_TLBIMVALIS) 2895 .unimplemented() 2896 .writes(1).exceptUserMode(); 2897 InitReg(MISCREG_TLBIMVAALIS) 2898 .unimplemented() 2899 .writes(1).exceptUserMode(); 2900 InitReg(MISCREG_ITLBIALL) 2901 .writes(1).exceptUserMode(); 2902 InitReg(MISCREG_ITLBIMVA) 2903 .writes(1).exceptUserMode(); 2904 InitReg(MISCREG_ITLBIASID) 2905 .writes(1).exceptUserMode(); 2906 InitReg(MISCREG_DTLBIALL) 2907 .writes(1).exceptUserMode(); 2908 InitReg(MISCREG_DTLBIMVA) 2909 .writes(1).exceptUserMode(); 2910 InitReg(MISCREG_DTLBIASID) 2911 .writes(1).exceptUserMode(); 2912 InitReg(MISCREG_TLBIALL) 2913 .writes(1).exceptUserMode(); 2914 InitReg(MISCREG_TLBIMVA) 2915 .writes(1).exceptUserMode(); 2916 InitReg(MISCREG_TLBIASID) 2917 .writes(1).exceptUserMode(); 2918 InitReg(MISCREG_TLBIMVAA) 2919 .writes(1).exceptUserMode(); 2920 InitReg(MISCREG_TLBIMVAL) 2921 .unimplemented() 2922 .writes(1).exceptUserMode(); 2923 InitReg(MISCREG_TLBIMVAAL) 2924 .unimplemented() 2925 .writes(1).exceptUserMode(); 2926 InitReg(MISCREG_TLBIIPAS2IS) 2927 .unimplemented() 2928 .monNonSecureWrite().hypWrite(); 2929 InitReg(MISCREG_TLBIIPAS2LIS) 2930 .unimplemented() 2931 .monNonSecureWrite().hypWrite(); 2932 InitReg(MISCREG_TLBIALLHIS) 2933 .monNonSecureWrite().hypWrite(); 2934 InitReg(MISCREG_TLBIMVAHIS) 2935 .monNonSecureWrite().hypWrite(); 2936 InitReg(MISCREG_TLBIALLNSNHIS) 2937 .monNonSecureWrite().hypWrite(); 2938 InitReg(MISCREG_TLBIMVALHIS) 2939 .unimplemented() 2940 .monNonSecureWrite().hypWrite(); 2941 InitReg(MISCREG_TLBIIPAS2) 2942 .unimplemented() 2943 .monNonSecureWrite().hypWrite(); 2944 InitReg(MISCREG_TLBIIPAS2L) 2945 .unimplemented() 2946 .monNonSecureWrite().hypWrite(); 2947 InitReg(MISCREG_TLBIALLH) 2948 .monNonSecureWrite().hypWrite(); 2949 InitReg(MISCREG_TLBIMVAH) 2950 .monNonSecureWrite().hypWrite(); 2951 InitReg(MISCREG_TLBIALLNSNH) 2952 .monNonSecureWrite().hypWrite(); 2953 InitReg(MISCREG_TLBIMVALH) 2954 .unimplemented() 2955 .monNonSecureWrite().hypWrite(); 2956 InitReg(MISCREG_PMCR) 2957 .allPrivileges(); 2958 InitReg(MISCREG_PMCNTENSET) 2959 .allPrivileges(); 2960 InitReg(MISCREG_PMCNTENCLR) 2961 .allPrivileges(); 2962 InitReg(MISCREG_PMOVSR) 2963 .allPrivileges(); 2964 InitReg(MISCREG_PMSWINC) 2965 .allPrivileges(); 2966 InitReg(MISCREG_PMSELR) 2967 .allPrivileges(); 2968 InitReg(MISCREG_PMCEID0) 2969 .allPrivileges(); 2970 InitReg(MISCREG_PMCEID1) 2971 .allPrivileges(); 2972 InitReg(MISCREG_PMCCNTR) 2973 .allPrivileges(); 2974 InitReg(MISCREG_PMXEVTYPER) 2975 .allPrivileges(); 2976 InitReg(MISCREG_PMCCFILTR) 2977 .allPrivileges(); 2978 InitReg(MISCREG_PMXEVCNTR) 2979 .allPrivileges(); 2980 InitReg(MISCREG_PMUSERENR) 2981 .allPrivileges().userNonSecureWrite(0).userSecureWrite(0); 2982 InitReg(MISCREG_PMINTENSET) 2983 .allPrivileges().exceptUserMode(); 2984 InitReg(MISCREG_PMINTENCLR) 2985 .allPrivileges().exceptUserMode(); 2986 InitReg(MISCREG_PMOVSSET) 2987 .unimplemented() 2988 .allPrivileges(); 2989 InitReg(MISCREG_L2CTLR) 2990 .allPrivileges().exceptUserMode(); 2991 InitReg(MISCREG_L2ECTLR) 2992 .unimplemented() 2993 .allPrivileges().exceptUserMode(); 2994 InitReg(MISCREG_PRRR) 2995 .banked(); 2996 InitReg(MISCREG_PRRR_NS) 2997 .bankedChild() 2998 .nonSecure().exceptUserMode(); 2999 InitReg(MISCREG_PRRR_S) 3000 .bankedChild() 3001 .secure().exceptUserMode(); 3002 InitReg(MISCREG_MAIR0) 3003 .banked(); 3004 InitReg(MISCREG_MAIR0_NS) 3005 .bankedChild() 3006 .nonSecure().exceptUserMode(); 3007 InitReg(MISCREG_MAIR0_S) 3008 .bankedChild() 3009 .secure().exceptUserMode(); 3010 InitReg(MISCREG_NMRR) 3011 .banked(); 3012 InitReg(MISCREG_NMRR_NS) 3013 .bankedChild() 3014 .nonSecure().exceptUserMode(); 3015 InitReg(MISCREG_NMRR_S) 3016 .bankedChild() 3017 .secure().exceptUserMode(); 3018 InitReg(MISCREG_MAIR1) 3019 .banked(); 3020 InitReg(MISCREG_MAIR1_NS) 3021 .bankedChild() 3022 .nonSecure().exceptUserMode(); 3023 InitReg(MISCREG_MAIR1_S) 3024 .bankedChild() 3025 .secure().exceptUserMode(); 3026 InitReg(MISCREG_AMAIR0) 3027 .banked(); 3028 InitReg(MISCREG_AMAIR0_NS) 3029 .bankedChild() 3030 .nonSecure().exceptUserMode(); 3031 InitReg(MISCREG_AMAIR0_S) 3032 .bankedChild() 3033 .secure().exceptUserMode(); 3034 InitReg(MISCREG_AMAIR1) 3035 .banked(); 3036 InitReg(MISCREG_AMAIR1_NS) 3037 .bankedChild() 3038 .nonSecure().exceptUserMode(); 3039 InitReg(MISCREG_AMAIR1_S) 3040 .bankedChild() 3041 .secure().exceptUserMode(); 3042 InitReg(MISCREG_HMAIR0) 3043 .hyp().monNonSecure(); 3044 InitReg(MISCREG_HMAIR1) 3045 .hyp().monNonSecure(); 3046 InitReg(MISCREG_HAMAIR0) 3047 .unimplemented() 3048 .warnNotFail() 3049 .hyp().monNonSecure(); 3050 InitReg(MISCREG_HAMAIR1) 3051 .unimplemented() 3052 .warnNotFail() 3053 .hyp().monNonSecure(); 3054 InitReg(MISCREG_VBAR) 3055 .banked(); 3056 InitReg(MISCREG_VBAR_NS) 3057 .bankedChild() 3058 .nonSecure().exceptUserMode(); 3059 InitReg(MISCREG_VBAR_S) 3060 .bankedChild() 3061 .secure().exceptUserMode(); 3062 InitReg(MISCREG_MVBAR) 3063 .mon().secure().exceptUserMode(); 3064 InitReg(MISCREG_RMR) 3065 .unimplemented() 3066 .mon().secure().exceptUserMode(); 3067 InitReg(MISCREG_ISR) 3068 .allPrivileges().exceptUserMode().writes(0); 3069 InitReg(MISCREG_HVBAR) 3070 .hyp().monNonSecure(); 3071 InitReg(MISCREG_FCSEIDR) 3072 .unimplemented() 3073 .warnNotFail() 3074 .allPrivileges().exceptUserMode(); 3075 InitReg(MISCREG_CONTEXTIDR) 3076 .banked(); 3077 InitReg(MISCREG_CONTEXTIDR_NS) 3078 .bankedChild() 3079 .nonSecure().exceptUserMode(); 3080 InitReg(MISCREG_CONTEXTIDR_S) 3081 .bankedChild() 3082 .secure().exceptUserMode(); 3083 InitReg(MISCREG_TPIDRURW) 3084 .banked(); 3085 InitReg(MISCREG_TPIDRURW_NS) 3086 .bankedChild() 3087 .allPrivileges().monSecure(0).privSecure(0); 3088 InitReg(MISCREG_TPIDRURW_S) 3089 .bankedChild() 3090 .secure(); 3091 InitReg(MISCREG_TPIDRURO) 3092 .banked(); 3093 InitReg(MISCREG_TPIDRURO_NS) 3094 .bankedChild() 3095 .allPrivileges().secure(0).userNonSecureWrite(0).userSecureRead(1); 3096 InitReg(MISCREG_TPIDRURO_S) 3097 .bankedChild() 3098 .secure().userSecureWrite(0); 3099 InitReg(MISCREG_TPIDRPRW) 3100 .banked(); 3101 InitReg(MISCREG_TPIDRPRW_NS) 3102 .bankedChild() 3103 .nonSecure().exceptUserMode(); 3104 InitReg(MISCREG_TPIDRPRW_S) 3105 .bankedChild() 3106 .secure().exceptUserMode(); 3107 InitReg(MISCREG_HTPIDR) 3108 .hyp().monNonSecure(); 3109 InitReg(MISCREG_CNTFRQ) 3110 .unverifiable() 3111 .reads(1).mon(); 3112 InitReg(MISCREG_CNTKCTL) 3113 .allPrivileges().exceptUserMode(); 3114 InitReg(MISCREG_CNTP_TVAL) 3115 .banked(); 3116 InitReg(MISCREG_CNTP_TVAL_NS) 3117 .bankedChild() 3118 .allPrivileges().monSecure(0).privSecure(0); 3119 InitReg(MISCREG_CNTP_TVAL_S) 3120 .unimplemented() 3121 .bankedChild() 3122 .secure().user(1); 3123 InitReg(MISCREG_CNTP_CTL) 3124 .banked(); 3125 InitReg(MISCREG_CNTP_CTL_NS) 3126 .bankedChild() 3127 .allPrivileges().monSecure(0).privSecure(0); 3128 InitReg(MISCREG_CNTP_CTL_S) 3129 .unimplemented() 3130 .bankedChild() 3131 .secure().user(1); 3132 InitReg(MISCREG_CNTV_TVAL) 3133 .allPrivileges(); 3134 InitReg(MISCREG_CNTV_CTL) 3135 .allPrivileges(); 3136 InitReg(MISCREG_CNTHCTL) 3137 .unimplemented() 3138 .hypWrite().monNonSecureRead(); 3139 InitReg(MISCREG_CNTHP_TVAL) 3140 .unimplemented() 3141 .hypWrite().monNonSecureRead(); 3142 InitReg(MISCREG_CNTHP_CTL) 3143 .unimplemented() 3144 .hypWrite().monNonSecureRead(); 3145 InitReg(MISCREG_IL1DATA0) 3146 .unimplemented() 3147 .allPrivileges().exceptUserMode(); 3148 InitReg(MISCREG_IL1DATA1) 3149 .unimplemented() 3150 .allPrivileges().exceptUserMode(); 3151 InitReg(MISCREG_IL1DATA2) 3152 .unimplemented() 3153 .allPrivileges().exceptUserMode(); 3154 InitReg(MISCREG_IL1DATA3) 3155 .unimplemented() 3156 .allPrivileges().exceptUserMode(); 3157 InitReg(MISCREG_DL1DATA0) 3158 .unimplemented() 3159 .allPrivileges().exceptUserMode(); 3160 InitReg(MISCREG_DL1DATA1) 3161 .unimplemented() 3162 .allPrivileges().exceptUserMode(); 3163 InitReg(MISCREG_DL1DATA2) 3164 .unimplemented() 3165 .allPrivileges().exceptUserMode(); 3166 InitReg(MISCREG_DL1DATA3) 3167 .unimplemented() 3168 .allPrivileges().exceptUserMode(); 3169 InitReg(MISCREG_DL1DATA4) 3170 .unimplemented() 3171 .allPrivileges().exceptUserMode(); 3172 InitReg(MISCREG_RAMINDEX) 3173 .unimplemented() 3174 .writes(1).exceptUserMode(); 3175 InitReg(MISCREG_L2ACTLR) 3176 .unimplemented() 3177 .allPrivileges().exceptUserMode(); 3178 InitReg(MISCREG_CBAR) 3179 .unimplemented() 3180 .allPrivileges().exceptUserMode().writes(0); 3181 InitReg(MISCREG_HTTBR) 3182 .hyp().monNonSecure(); 3183 InitReg(MISCREG_VTTBR) 3184 .hyp().monNonSecure(); 3185 InitReg(MISCREG_CNTPCT) 3186 .reads(1); 3187 InitReg(MISCREG_CNTVCT) 3188 .unverifiable() 3189 .reads(1); 3190 InitReg(MISCREG_CNTP_CVAL) 3191 .banked(); 3192 InitReg(MISCREG_CNTP_CVAL_NS) 3193 .bankedChild() 3194 .allPrivileges().monSecure(0).privSecure(0); 3195 InitReg(MISCREG_CNTP_CVAL_S) 3196 .unimplemented() 3197 .bankedChild() 3198 .secure().user(1); 3199 InitReg(MISCREG_CNTV_CVAL) 3200 .allPrivileges(); 3201 InitReg(MISCREG_CNTVOFF) 3202 .hyp().monNonSecure(); 3203 InitReg(MISCREG_CNTHP_CVAL) 3204 .unimplemented() 3205 .hypWrite().monNonSecureRead(); 3206 InitReg(MISCREG_CPUMERRSR) 3207 .unimplemented() 3208 .allPrivileges().exceptUserMode(); 3209 InitReg(MISCREG_L2MERRSR) 3210 .unimplemented() 3211 .warnNotFail() 3212 .allPrivileges().exceptUserMode(); 3213 3214 // AArch64 registers (Op0=2); 3215 InitReg(MISCREG_MDCCINT_EL1) 3216 .allPrivileges(); 3217 InitReg(MISCREG_OSDTRRX_EL1) 3218 .allPrivileges() 3219 .mapsTo(MISCREG_DBGDTRRXext); 3220 InitReg(MISCREG_MDSCR_EL1) 3221 .allPrivileges() 3222 .mapsTo(MISCREG_DBGDSCRext); 3223 InitReg(MISCREG_OSDTRTX_EL1) 3224 .allPrivileges() 3225 .mapsTo(MISCREG_DBGDTRTXext); 3226 InitReg(MISCREG_OSECCR_EL1) 3227 .allPrivileges() 3228 .mapsTo(MISCREG_DBGOSECCR); 3229 InitReg(MISCREG_DBGBVR0_EL1) 3230 .allPrivileges() 3231 .mapsTo(MISCREG_DBGBVR0 /*, MISCREG_DBGBXVR0 */); 3232 InitReg(MISCREG_DBGBVR1_EL1) 3233 .allPrivileges() 3234 .mapsTo(MISCREG_DBGBVR1 /*, MISCREG_DBGBXVR1 */); 3235 InitReg(MISCREG_DBGBVR2_EL1) 3236 .allPrivileges() 3237 .mapsTo(MISCREG_DBGBVR2 /*, MISCREG_DBGBXVR2 */); 3238 InitReg(MISCREG_DBGBVR3_EL1) 3239 .allPrivileges() 3240 .mapsTo(MISCREG_DBGBVR3 /*, MISCREG_DBGBXVR3 */); 3241 InitReg(MISCREG_DBGBVR4_EL1) 3242 .allPrivileges() 3243 .mapsTo(MISCREG_DBGBVR4 /*, MISCREG_DBGBXVR4 */); 3244 InitReg(MISCREG_DBGBVR5_EL1) 3245 .allPrivileges() 3246 .mapsTo(MISCREG_DBGBVR5 /*, MISCREG_DBGBXVR5 */); 3247 InitReg(MISCREG_DBGBCR0_EL1) 3248 .allPrivileges() 3249 .mapsTo(MISCREG_DBGBCR0); 3250 InitReg(MISCREG_DBGBCR1_EL1) 3251 .allPrivileges() 3252 .mapsTo(MISCREG_DBGBCR1); 3253 InitReg(MISCREG_DBGBCR2_EL1) 3254 .allPrivileges() 3255 .mapsTo(MISCREG_DBGBCR2); 3256 InitReg(MISCREG_DBGBCR3_EL1) 3257 .allPrivileges() 3258 .mapsTo(MISCREG_DBGBCR3); 3259 InitReg(MISCREG_DBGBCR4_EL1) 3260 .allPrivileges() 3261 .mapsTo(MISCREG_DBGBCR4); 3262 InitReg(MISCREG_DBGBCR5_EL1) 3263 .allPrivileges() 3264 .mapsTo(MISCREG_DBGBCR5); 3265 InitReg(MISCREG_DBGWVR0_EL1) 3266 .allPrivileges() 3267 .mapsTo(MISCREG_DBGWVR0); 3268 InitReg(MISCREG_DBGWVR1_EL1) 3269 .allPrivileges() 3270 .mapsTo(MISCREG_DBGWVR1); 3271 InitReg(MISCREG_DBGWVR2_EL1) 3272 .allPrivileges() 3273 .mapsTo(MISCREG_DBGWVR2); 3274 InitReg(MISCREG_DBGWVR3_EL1) 3275 .allPrivileges() 3276 .mapsTo(MISCREG_DBGWVR3); 3277 InitReg(MISCREG_DBGWCR0_EL1) 3278 .allPrivileges() 3279 .mapsTo(MISCREG_DBGWCR0); 3280 InitReg(MISCREG_DBGWCR1_EL1) 3281 .allPrivileges() 3282 .mapsTo(MISCREG_DBGWCR1); 3283 InitReg(MISCREG_DBGWCR2_EL1) 3284 .allPrivileges() 3285 .mapsTo(MISCREG_DBGWCR2); 3286 InitReg(MISCREG_DBGWCR3_EL1) 3287 .allPrivileges() 3288 .mapsTo(MISCREG_DBGWCR3); 3289 InitReg(MISCREG_MDCCSR_EL0) 3290 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0) 3291 .mapsTo(MISCREG_DBGDSCRint); 3292 InitReg(MISCREG_MDDTR_EL0) 3293 .allPrivileges(); 3294 InitReg(MISCREG_MDDTRTX_EL0) 3295 .allPrivileges(); 3296 InitReg(MISCREG_MDDTRRX_EL0) 3297 .allPrivileges(); 3298 InitReg(MISCREG_DBGVCR32_EL2) 3299 .allPrivileges() 3300 .mapsTo(MISCREG_DBGVCR); 3301 InitReg(MISCREG_MDRAR_EL1) 3302 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0) 3303 .mapsTo(MISCREG_DBGDRAR); 3304 InitReg(MISCREG_OSLAR_EL1) 3305 .allPrivileges().monSecureRead(0).monNonSecureRead(0) 3306 .mapsTo(MISCREG_DBGOSLAR); 3307 InitReg(MISCREG_OSLSR_EL1) 3308 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0) 3309 .mapsTo(MISCREG_DBGOSLSR); 3310 InitReg(MISCREG_OSDLR_EL1) 3311 .allPrivileges() 3312 .mapsTo(MISCREG_DBGOSDLR); 3313 InitReg(MISCREG_DBGPRCR_EL1) 3314 .allPrivileges() 3315 .mapsTo(MISCREG_DBGPRCR); 3316 InitReg(MISCREG_DBGCLAIMSET_EL1) 3317 .allPrivileges() 3318 .mapsTo(MISCREG_DBGCLAIMSET); 3319 InitReg(MISCREG_DBGCLAIMCLR_EL1) 3320 .allPrivileges() 3321 .mapsTo(MISCREG_DBGCLAIMCLR); 3322 InitReg(MISCREG_DBGAUTHSTATUS_EL1) 3323 .allPrivileges().monSecureWrite(0).monNonSecureWrite(0) 3324 .mapsTo(MISCREG_DBGAUTHSTATUS); 3325 InitReg(MISCREG_TEECR32_EL1); 3326 InitReg(MISCREG_TEEHBR32_EL1); 3327 3328 // AArch64 registers (Op0=1,3); 3329 InitReg(MISCREG_MIDR_EL1) 3330 .allPrivileges().exceptUserMode().writes(0); 3331 InitReg(MISCREG_MPIDR_EL1) 3332 .allPrivileges().exceptUserMode().writes(0); 3333 InitReg(MISCREG_REVIDR_EL1) 3334 .allPrivileges().exceptUserMode().writes(0); 3335 InitReg(MISCREG_ID_PFR0_EL1) 3336 .allPrivileges().exceptUserMode().writes(0); 3337 InitReg(MISCREG_ID_PFR1_EL1) 3338 .allPrivileges().exceptUserMode().writes(0); 3339 InitReg(MISCREG_ID_DFR0_EL1) 3340 .allPrivileges().exceptUserMode().writes(0) 3341 .mapsTo(MISCREG_ID_DFR0); 3342 InitReg(MISCREG_ID_AFR0_EL1) 3343 .allPrivileges().exceptUserMode().writes(0); 3344 InitReg(MISCREG_ID_MMFR0_EL1) 3345 .allPrivileges().exceptUserMode().writes(0); 3346 InitReg(MISCREG_ID_MMFR1_EL1) 3347 .allPrivileges().exceptUserMode().writes(0); 3348 InitReg(MISCREG_ID_MMFR2_EL1) 3349 .allPrivileges().exceptUserMode().writes(0); 3350 InitReg(MISCREG_ID_MMFR3_EL1) 3351 .allPrivileges().exceptUserMode().writes(0); 3352 InitReg(MISCREG_ID_ISAR0_EL1) 3353 .allPrivileges().exceptUserMode().writes(0); 3354 InitReg(MISCREG_ID_ISAR1_EL1) 3355 .allPrivileges().exceptUserMode().writes(0); 3356 InitReg(MISCREG_ID_ISAR2_EL1) 3357 .allPrivileges().exceptUserMode().writes(0); 3358 InitReg(MISCREG_ID_ISAR3_EL1) 3359 .allPrivileges().exceptUserMode().writes(0); 3360 InitReg(MISCREG_ID_ISAR4_EL1) 3361 .allPrivileges().exceptUserMode().writes(0); 3362 InitReg(MISCREG_ID_ISAR5_EL1) 3363 .allPrivileges().exceptUserMode().writes(0); 3364 InitReg(MISCREG_MVFR0_EL1) 3365 .allPrivileges().exceptUserMode().writes(0); 3366 InitReg(MISCREG_MVFR1_EL1) 3367 .allPrivileges().exceptUserMode().writes(0); 3368 InitReg(MISCREG_MVFR2_EL1) 3369 .allPrivileges().exceptUserMode().writes(0); 3370 InitReg(MISCREG_ID_AA64PFR0_EL1) 3371 .allPrivileges().exceptUserMode().writes(0); 3372 InitReg(MISCREG_ID_AA64PFR1_EL1) 3373 .allPrivileges().exceptUserMode().writes(0); 3374 InitReg(MISCREG_ID_AA64DFR0_EL1) 3375 .allPrivileges().exceptUserMode().writes(0); 3376 InitReg(MISCREG_ID_AA64DFR1_EL1) 3377 .allPrivileges().exceptUserMode().writes(0); 3378 InitReg(MISCREG_ID_AA64AFR0_EL1) 3379 .allPrivileges().exceptUserMode().writes(0); 3380 InitReg(MISCREG_ID_AA64AFR1_EL1) 3381 .allPrivileges().exceptUserMode().writes(0); 3382 InitReg(MISCREG_ID_AA64ISAR0_EL1) 3383 .allPrivileges().exceptUserMode().writes(0); 3384 InitReg(MISCREG_ID_AA64ISAR1_EL1) 3385 .allPrivileges().exceptUserMode().writes(0); 3386 InitReg(MISCREG_ID_AA64MMFR0_EL1) 3387 .allPrivileges().exceptUserMode().writes(0); 3388 InitReg(MISCREG_ID_AA64MMFR1_EL1) 3389 .allPrivileges().exceptUserMode().writes(0); 3390 InitReg(MISCREG_CCSIDR_EL1) 3391 .allPrivileges().exceptUserMode().writes(0); 3392 InitReg(MISCREG_CLIDR_EL1) 3393 .allPrivileges().exceptUserMode().writes(0); 3394 InitReg(MISCREG_AIDR_EL1) 3395 .allPrivileges().exceptUserMode().writes(0); 3396 InitReg(MISCREG_CSSELR_EL1) 3397 .allPrivileges().exceptUserMode() 3398 .mapsTo(MISCREG_CSSELR_NS); 3399 InitReg(MISCREG_CTR_EL0) 3400 .reads(1); 3401 InitReg(MISCREG_DCZID_EL0) 3402 .reads(1); 3403 InitReg(MISCREG_VPIDR_EL2) 3404 .hyp().mon() 3405 .mapsTo(MISCREG_VPIDR); 3406 InitReg(MISCREG_VMPIDR_EL2) 3407 .hyp().mon() 3408 .mapsTo(MISCREG_VMPIDR); 3409 InitReg(MISCREG_SCTLR_EL1) 3410 .allPrivileges().exceptUserMode() 3411 .mapsTo(MISCREG_SCTLR_NS); 3412 InitReg(MISCREG_ACTLR_EL1) 3413 .allPrivileges().exceptUserMode() 3414 .mapsTo(MISCREG_ACTLR_NS); 3415 InitReg(MISCREG_CPACR_EL1) 3416 .allPrivileges().exceptUserMode() 3417 .mapsTo(MISCREG_CPACR); 3418 InitReg(MISCREG_SCTLR_EL2) 3419 .hyp().mon() 3420 .mapsTo(MISCREG_HSCTLR); 3421 InitReg(MISCREG_ACTLR_EL2) 3422 .hyp().mon() 3423 .mapsTo(MISCREG_HACTLR); 3424 InitReg(MISCREG_HCR_EL2) 3425 .hyp().mon() 3426 .mapsTo(MISCREG_HCR /*, MISCREG_HCR2*/); 3427 InitReg(MISCREG_MDCR_EL2) 3428 .hyp().mon() 3429 .mapsTo(MISCREG_HDCR); 3430 InitReg(MISCREG_CPTR_EL2) 3431 .hyp().mon() 3432 .mapsTo(MISCREG_HCPTR); 3433 InitReg(MISCREG_HSTR_EL2) 3434 .hyp().mon() 3435 .mapsTo(MISCREG_HSTR); 3436 InitReg(MISCREG_HACR_EL2) 3437 .hyp().mon() 3438 .mapsTo(MISCREG_HACR); 3439 InitReg(MISCREG_SCTLR_EL3) 3440 .mon(); 3441 InitReg(MISCREG_ACTLR_EL3) 3442 .mon(); 3443 InitReg(MISCREG_SCR_EL3) 3444 .mon() 3445 .mapsTo(MISCREG_SCR); // NAM D7-2005 3446 InitReg(MISCREG_SDER32_EL3) 3447 .mon() 3448 .mapsTo(MISCREG_SDER); 3449 InitReg(MISCREG_CPTR_EL3) 3450 .mon(); 3451 InitReg(MISCREG_MDCR_EL3) 3452 .mon(); 3453 InitReg(MISCREG_TTBR0_EL1) 3454 .allPrivileges().exceptUserMode() 3455 .mapsTo(MISCREG_TTBR0_NS); 3456 InitReg(MISCREG_TTBR1_EL1) 3457 .allPrivileges().exceptUserMode() 3458 .mapsTo(MISCREG_TTBR1_NS); 3459 InitReg(MISCREG_TCR_EL1) 3460 .allPrivileges().exceptUserMode() 3461 .mapsTo(MISCREG_TTBCR_NS); 3462 InitReg(MISCREG_TTBR0_EL2) 3463 .hyp().mon() 3464 .mapsTo(MISCREG_HTTBR); 3465 InitReg(MISCREG_TCR_EL2) 3466 .hyp().mon() 3467 .mapsTo(MISCREG_HTCR); 3468 InitReg(MISCREG_VTTBR_EL2) 3469 .hyp().mon() 3470 .mapsTo(MISCREG_VTTBR); 3471 InitReg(MISCREG_VTCR_EL2) 3472 .hyp().mon() 3473 .mapsTo(MISCREG_VTCR); 3474 InitReg(MISCREG_TTBR0_EL3) 3475 .mon(); 3476 InitReg(MISCREG_TCR_EL3) 3477 .mon(); 3478 InitReg(MISCREG_DACR32_EL2) 3479 .hyp().mon() 3480 .mapsTo(MISCREG_DACR_NS); 3481 InitReg(MISCREG_SPSR_EL1) 3482 .allPrivileges().exceptUserMode() 3483 .mapsTo(MISCREG_SPSR_SVC); // NAM C5.2.17 SPSR_EL1 3484 InitReg(MISCREG_ELR_EL1) 3485 .allPrivileges().exceptUserMode(); 3486 InitReg(MISCREG_SP_EL0) 3487 .allPrivileges().exceptUserMode(); 3488 InitReg(MISCREG_SPSEL) 3489 .allPrivileges().exceptUserMode(); 3490 InitReg(MISCREG_CURRENTEL) 3491 .allPrivileges().exceptUserMode().writes(0); 3492 InitReg(MISCREG_NZCV) 3493 .allPrivileges(); 3494 InitReg(MISCREG_DAIF) 3495 .allPrivileges(); 3496 InitReg(MISCREG_FPCR) 3497 .allPrivileges(); 3498 InitReg(MISCREG_FPSR) 3499 .allPrivileges(); 3500 InitReg(MISCREG_DSPSR_EL0) 3501 .allPrivileges(); 3502 InitReg(MISCREG_DLR_EL0) 3503 .allPrivileges(); 3504 InitReg(MISCREG_SPSR_EL2) 3505 .hyp().mon() 3506 .mapsTo(MISCREG_SPSR_HYP); // NAM C5.2.18 SPSR_EL2 3507 InitReg(MISCREG_ELR_EL2) 3508 .hyp().mon(); 3509 InitReg(MISCREG_SP_EL1) 3510 .hyp().mon(); 3511 InitReg(MISCREG_SPSR_IRQ_AA64) 3512 .hyp().mon(); 3513 InitReg(MISCREG_SPSR_ABT_AA64) 3514 .hyp().mon(); 3515 InitReg(MISCREG_SPSR_UND_AA64) 3516 .hyp().mon(); 3517 InitReg(MISCREG_SPSR_FIQ_AA64) 3518 .hyp().mon(); 3519 InitReg(MISCREG_SPSR_EL3) 3520 .mon() 3521 .mapsTo(MISCREG_SPSR_MON); // NAM C5.2.19 SPSR_EL3 3522 InitReg(MISCREG_ELR_EL3) 3523 .mon(); 3524 InitReg(MISCREG_SP_EL2) 3525 .mon(); 3526 InitReg(MISCREG_AFSR0_EL1) 3527 .allPrivileges().exceptUserMode() 3528 .mapsTo(MISCREG_ADFSR_NS); 3529 InitReg(MISCREG_AFSR1_EL1) 3530 .allPrivileges().exceptUserMode() 3531 .mapsTo(MISCREG_AIFSR_NS); 3532 InitReg(MISCREG_ESR_EL1) 3533 .allPrivileges().exceptUserMode(); 3534 InitReg(MISCREG_IFSR32_EL2) 3535 .hyp().mon() 3536 .mapsTo(MISCREG_IFSR_NS); 3537 InitReg(MISCREG_AFSR0_EL2) 3538 .hyp().mon() 3539 .mapsTo(MISCREG_HADFSR); 3540 InitReg(MISCREG_AFSR1_EL2) 3541 .hyp().mon() 3542 .mapsTo(MISCREG_HAIFSR); 3543 InitReg(MISCREG_ESR_EL2) 3544 .hyp().mon() 3545 .mapsTo(MISCREG_HSR); 3546 InitReg(MISCREG_FPEXC32_EL2) 3547 .hyp().mon(); 3548 InitReg(MISCREG_AFSR0_EL3) 3549 .mon(); 3550 InitReg(MISCREG_AFSR1_EL3) 3551 .mon(); 3552 InitReg(MISCREG_ESR_EL3) 3553 .mon(); 3554 InitReg(MISCREG_FAR_EL1) 3555 .allPrivileges().exceptUserMode() 3556 .mapsTo(MISCREG_DFAR_NS, MISCREG_IFAR_NS); 3557 InitReg(MISCREG_FAR_EL2) 3558 .hyp().mon() 3559 .mapsTo(MISCREG_HDFAR, MISCREG_HIFAR); 3560 InitReg(MISCREG_HPFAR_EL2) 3561 .hyp().mon() 3562 .mapsTo(MISCREG_HPFAR); 3563 InitReg(MISCREG_FAR_EL3) 3564 .mon(); 3565 InitReg(MISCREG_IC_IALLUIS) 3566 .warnNotFail() 3567 .writes(1).exceptUserMode(); 3568 InitReg(MISCREG_PAR_EL1) 3569 .allPrivileges().exceptUserMode() 3570 .mapsTo(MISCREG_PAR_NS); 3571 InitReg(MISCREG_IC_IALLU) 3572 .warnNotFail() 3573 .writes(1).exceptUserMode(); 3574 InitReg(MISCREG_DC_IVAC_Xt) 3575 .warnNotFail() 3576 .writes(1).exceptUserMode(); 3577 InitReg(MISCREG_DC_ISW_Xt) 3578 .warnNotFail() 3579 .writes(1).exceptUserMode(); 3580 InitReg(MISCREG_AT_S1E1R_Xt) 3581 .writes(1).exceptUserMode(); 3582 InitReg(MISCREG_AT_S1E1W_Xt) 3583 .writes(1).exceptUserMode(); 3584 InitReg(MISCREG_AT_S1E0R_Xt) 3585 .writes(1).exceptUserMode(); 3586 InitReg(MISCREG_AT_S1E0W_Xt) 3587 .writes(1).exceptUserMode(); 3588 InitReg(MISCREG_DC_CSW_Xt) 3589 .warnNotFail() 3590 .writes(1).exceptUserMode(); 3591 InitReg(MISCREG_DC_CISW_Xt) 3592 .warnNotFail() 3593 .writes(1).exceptUserMode(); 3594 InitReg(MISCREG_DC_ZVA_Xt) 3595 .warnNotFail() 3596 .writes(1).userSecureWrite(0); 3597 InitReg(MISCREG_IC_IVAU_Xt) 3598 .writes(1); 3599 InitReg(MISCREG_DC_CVAC_Xt) 3600 .warnNotFail() 3601 .writes(1); 3602 InitReg(MISCREG_DC_CVAU_Xt) 3603 .warnNotFail() 3604 .writes(1); 3605 InitReg(MISCREG_DC_CIVAC_Xt) 3606 .warnNotFail() 3607 .writes(1); 3608 InitReg(MISCREG_AT_S1E2R_Xt) 3609 .monNonSecureWrite().hypWrite(); 3610 InitReg(MISCREG_AT_S1E2W_Xt) 3611 .monNonSecureWrite().hypWrite(); 3612 InitReg(MISCREG_AT_S12E1R_Xt) 3613 .hypWrite().monSecureWrite().monNonSecureWrite(); 3614 InitReg(MISCREG_AT_S12E1W_Xt) 3615 .hypWrite().monSecureWrite().monNonSecureWrite(); 3616 InitReg(MISCREG_AT_S12E0R_Xt) 3617 .hypWrite().monSecureWrite().monNonSecureWrite(); 3618 InitReg(MISCREG_AT_S12E0W_Xt) 3619 .hypWrite().monSecureWrite().monNonSecureWrite(); 3620 InitReg(MISCREG_AT_S1E3R_Xt) 3621 .monSecureWrite().monNonSecureWrite(); 3622 InitReg(MISCREG_AT_S1E3W_Xt) 3623 .monSecureWrite().monNonSecureWrite(); 3624 InitReg(MISCREG_TLBI_VMALLE1IS) 3625 .writes(1).exceptUserMode(); 3626 InitReg(MISCREG_TLBI_VAE1IS_Xt) 3627 .writes(1).exceptUserMode(); 3628 InitReg(MISCREG_TLBI_ASIDE1IS_Xt) 3629 .writes(1).exceptUserMode(); 3630 InitReg(MISCREG_TLBI_VAAE1IS_Xt) 3631 .writes(1).exceptUserMode(); 3632 InitReg(MISCREG_TLBI_VALE1IS_Xt) 3633 .writes(1).exceptUserMode(); 3634 InitReg(MISCREG_TLBI_VAALE1IS_Xt) 3635 .writes(1).exceptUserMode(); 3636 InitReg(MISCREG_TLBI_VMALLE1) 3637 .writes(1).exceptUserMode(); 3638 InitReg(MISCREG_TLBI_VAE1_Xt) 3639 .writes(1).exceptUserMode(); 3640 InitReg(MISCREG_TLBI_ASIDE1_Xt) 3641 .writes(1).exceptUserMode(); 3642 InitReg(MISCREG_TLBI_VAAE1_Xt) 3643 .writes(1).exceptUserMode(); 3644 InitReg(MISCREG_TLBI_VALE1_Xt) 3645 .writes(1).exceptUserMode(); 3646 InitReg(MISCREG_TLBI_VAALE1_Xt) 3647 .writes(1).exceptUserMode(); 3648 InitReg(MISCREG_TLBI_IPAS2E1IS_Xt) 3649 .hypWrite().monSecureWrite().monNonSecureWrite(); 3650 InitReg(MISCREG_TLBI_IPAS2LE1IS_Xt) 3651 .hypWrite().monSecureWrite().monNonSecureWrite(); 3652 InitReg(MISCREG_TLBI_ALLE2IS) 3653 .monNonSecureWrite().hypWrite(); 3654 InitReg(MISCREG_TLBI_VAE2IS_Xt) 3655 .monNonSecureWrite().hypWrite(); 3656 InitReg(MISCREG_TLBI_ALLE1IS) 3657 .hypWrite().monSecureWrite().monNonSecureWrite(); 3658 InitReg(MISCREG_TLBI_VALE2IS_Xt) 3659 .monNonSecureWrite().hypWrite(); 3660 InitReg(MISCREG_TLBI_VMALLS12E1IS) 3661 .hypWrite().monSecureWrite().monNonSecureWrite(); 3662 InitReg(MISCREG_TLBI_IPAS2E1_Xt) 3663 .hypWrite().monSecureWrite().monNonSecureWrite(); 3664 InitReg(MISCREG_TLBI_IPAS2LE1_Xt) 3665 .hypWrite().monSecureWrite().monNonSecureWrite(); 3666 InitReg(MISCREG_TLBI_ALLE2) 3667 .monNonSecureWrite().hypWrite(); 3668 InitReg(MISCREG_TLBI_VAE2_Xt) 3669 .monNonSecureWrite().hypWrite(); 3670 InitReg(MISCREG_TLBI_ALLE1) 3671 .hypWrite().monSecureWrite().monNonSecureWrite(); 3672 InitReg(MISCREG_TLBI_VALE2_Xt) 3673 .monNonSecureWrite().hypWrite(); 3674 InitReg(MISCREG_TLBI_VMALLS12E1) 3675 .hypWrite().monSecureWrite().monNonSecureWrite(); 3676 InitReg(MISCREG_TLBI_ALLE3IS) 3677 .monSecureWrite().monNonSecureWrite(); 3678 InitReg(MISCREG_TLBI_VAE3IS_Xt) 3679 .monSecureWrite().monNonSecureWrite(); 3680 InitReg(MISCREG_TLBI_VALE3IS_Xt) 3681 .monSecureWrite().monNonSecureWrite(); 3682 InitReg(MISCREG_TLBI_ALLE3) 3683 .monSecureWrite().monNonSecureWrite(); 3684 InitReg(MISCREG_TLBI_VAE3_Xt) 3685 .monSecureWrite().monNonSecureWrite(); 3686 InitReg(MISCREG_TLBI_VALE3_Xt) 3687 .monSecureWrite().monNonSecureWrite(); 3688 InitReg(MISCREG_PMINTENSET_EL1) 3689 .allPrivileges().exceptUserMode() 3690 .mapsTo(MISCREG_PMINTENSET); 3691 InitReg(MISCREG_PMINTENCLR_EL1) 3692 .allPrivileges().exceptUserMode() 3693 .mapsTo(MISCREG_PMINTENCLR); 3694 InitReg(MISCREG_PMCR_EL0) 3695 .allPrivileges() 3696 .mapsTo(MISCREG_PMCR); 3697 InitReg(MISCREG_PMCNTENSET_EL0) 3698 .allPrivileges() 3699 .mapsTo(MISCREG_PMCNTENSET); 3700 InitReg(MISCREG_PMCNTENCLR_EL0) 3701 .allPrivileges() 3702 .mapsTo(MISCREG_PMCNTENCLR); 3703 InitReg(MISCREG_PMOVSCLR_EL0) 3704 .allPrivileges(); 3705// .mapsTo(MISCREG_PMOVSCLR); 3706 InitReg(MISCREG_PMSWINC_EL0) 3707 .writes(1).user() 3708 .mapsTo(MISCREG_PMSWINC); 3709 InitReg(MISCREG_PMSELR_EL0) 3710 .allPrivileges() 3711 .mapsTo(MISCREG_PMSELR); 3712 InitReg(MISCREG_PMCEID0_EL0) 3713 .reads(1).user() 3714 .mapsTo(MISCREG_PMCEID0); 3715 InitReg(MISCREG_PMCEID1_EL0) 3716 .reads(1).user() 3717 .mapsTo(MISCREG_PMCEID1); 3718 InitReg(MISCREG_PMCCNTR_EL0) 3719 .allPrivileges() 3720 .mapsTo(MISCREG_PMCCNTR); 3721 InitReg(MISCREG_PMXEVTYPER_EL0) 3722 .allPrivileges() 3723 .mapsTo(MISCREG_PMXEVTYPER); 3724 InitReg(MISCREG_PMCCFILTR_EL0) 3725 .allPrivileges(); 3726 InitReg(MISCREG_PMXEVCNTR_EL0) 3727 .allPrivileges() 3728 .mapsTo(MISCREG_PMXEVCNTR); 3729 InitReg(MISCREG_PMUSERENR_EL0) 3730 .allPrivileges().userNonSecureWrite(0).userSecureWrite(0) 3731 .mapsTo(MISCREG_PMUSERENR); 3732 InitReg(MISCREG_PMOVSSET_EL0) 3733 .allPrivileges() 3734 .mapsTo(MISCREG_PMOVSSET); 3735 InitReg(MISCREG_MAIR_EL1) 3736 .allPrivileges().exceptUserMode() 3737 .mapsTo(MISCREG_PRRR_NS, MISCREG_NMRR_NS); 3738 InitReg(MISCREG_AMAIR_EL1) 3739 .allPrivileges().exceptUserMode() 3740 .mapsTo(MISCREG_AMAIR0_NS, MISCREG_AMAIR1_NS); 3741 InitReg(MISCREG_MAIR_EL2) 3742 .hyp().mon() 3743 .mapsTo(MISCREG_HMAIR0, MISCREG_HMAIR1); 3744 InitReg(MISCREG_AMAIR_EL2) 3745 .hyp().mon() 3746 .mapsTo(MISCREG_HAMAIR0, MISCREG_HAMAIR1); 3747 InitReg(MISCREG_MAIR_EL3) 3748 .mon(); 3749 InitReg(MISCREG_AMAIR_EL3) 3750 .mon(); 3751 InitReg(MISCREG_L2CTLR_EL1) 3752 .allPrivileges().exceptUserMode(); 3753 InitReg(MISCREG_L2ECTLR_EL1) 3754 .allPrivileges().exceptUserMode(); 3755 InitReg(MISCREG_VBAR_EL1) 3756 .allPrivileges().exceptUserMode() 3757 .mapsTo(MISCREG_VBAR_NS); 3758 InitReg(MISCREG_RVBAR_EL1) 3759 .allPrivileges().exceptUserMode().writes(0); 3760 InitReg(MISCREG_ISR_EL1) 3761 .allPrivileges().exceptUserMode().writes(0); 3762 InitReg(MISCREG_VBAR_EL2) 3763 .hyp().mon() 3764 .mapsTo(MISCREG_HVBAR); 3765 InitReg(MISCREG_RVBAR_EL2) 3766 .mon().hyp().writes(0); 3767 InitReg(MISCREG_VBAR_EL3) 3768 .mon(); 3769 InitReg(MISCREG_RVBAR_EL3) 3770 .mon().writes(0); 3771 InitReg(MISCREG_RMR_EL3) 3772 .mon(); 3773 InitReg(MISCREG_CONTEXTIDR_EL1) 3774 .allPrivileges().exceptUserMode() 3775 .mapsTo(MISCREG_CONTEXTIDR_NS); 3776 InitReg(MISCREG_TPIDR_EL1) 3777 .allPrivileges().exceptUserMode() 3778 .mapsTo(MISCREG_TPIDRPRW_NS); 3779 InitReg(MISCREG_TPIDR_EL0) 3780 .allPrivileges() 3781 .mapsTo(MISCREG_TPIDRURW_NS); 3782 InitReg(MISCREG_TPIDRRO_EL0) 3783 .allPrivileges().userNonSecureWrite(0).userSecureWrite(0) 3784 .mapsTo(MISCREG_TPIDRURO_NS); 3785 InitReg(MISCREG_TPIDR_EL2) 3786 .hyp().mon() 3787 .mapsTo(MISCREG_HTPIDR); 3788 InitReg(MISCREG_TPIDR_EL3) 3789 .mon(); 3790 InitReg(MISCREG_CNTKCTL_EL1) 3791 .allPrivileges().exceptUserMode() 3792 .mapsTo(MISCREG_CNTKCTL); 3793 InitReg(MISCREG_CNTFRQ_EL0) 3794 .reads(1).mon() 3795 .mapsTo(MISCREG_CNTFRQ); 3796 InitReg(MISCREG_CNTPCT_EL0) 3797 .reads(1) 3798 .mapsTo(MISCREG_CNTPCT); /* 64b */ 3799 InitReg(MISCREG_CNTVCT_EL0) 3800 .unverifiable() 3801 .reads(1) 3802 .mapsTo(MISCREG_CNTVCT); /* 64b */ 3803 InitReg(MISCREG_CNTP_TVAL_EL0) 3804 .allPrivileges() 3805 .mapsTo(MISCREG_CNTP_TVAL_NS); 3806 InitReg(MISCREG_CNTP_CTL_EL0) 3807 .allPrivileges() 3808 .mapsTo(MISCREG_CNTP_CTL_NS); 3809 InitReg(MISCREG_CNTP_CVAL_EL0) 3810 .allPrivileges() 3811 .mapsTo(MISCREG_CNTP_CVAL_NS); /* 64b */ 3812 InitReg(MISCREG_CNTV_TVAL_EL0) 3813 .allPrivileges() 3814 .mapsTo(MISCREG_CNTV_TVAL); 3815 InitReg(MISCREG_CNTV_CTL_EL0) 3816 .allPrivileges() 3817 .mapsTo(MISCREG_CNTV_CTL); 3818 InitReg(MISCREG_CNTV_CVAL_EL0) 3819 .allPrivileges() 3820 .mapsTo(MISCREG_CNTV_CVAL); /* 64b */ 3821 InitReg(MISCREG_PMEVCNTR0_EL0) 3822 .allPrivileges(); 3823// .mapsTo(MISCREG_PMEVCNTR0); 3824 InitReg(MISCREG_PMEVCNTR1_EL0) 3825 .allPrivileges(); 3826// .mapsTo(MISCREG_PMEVCNTR1); 3827 InitReg(MISCREG_PMEVCNTR2_EL0) 3828 .allPrivileges(); 3829// .mapsTo(MISCREG_PMEVCNTR2); 3830 InitReg(MISCREG_PMEVCNTR3_EL0) 3831 .allPrivileges(); 3832// .mapsTo(MISCREG_PMEVCNTR3); 3833 InitReg(MISCREG_PMEVCNTR4_EL0) 3834 .allPrivileges(); 3835// .mapsTo(MISCREG_PMEVCNTR4); 3836 InitReg(MISCREG_PMEVCNTR5_EL0) 3837 .allPrivileges(); 3838// .mapsTo(MISCREG_PMEVCNTR5); 3839 InitReg(MISCREG_PMEVTYPER0_EL0) 3840 .allPrivileges(); 3841// .mapsTo(MISCREG_PMEVTYPER0); 3842 InitReg(MISCREG_PMEVTYPER1_EL0) 3843 .allPrivileges(); 3844// .mapsTo(MISCREG_PMEVTYPER1); 3845 InitReg(MISCREG_PMEVTYPER2_EL0) 3846 .allPrivileges(); 3847// .mapsTo(MISCREG_PMEVTYPER2); 3848 InitReg(MISCREG_PMEVTYPER3_EL0) 3849 .allPrivileges(); 3850// .mapsTo(MISCREG_PMEVTYPER3); 3851 InitReg(MISCREG_PMEVTYPER4_EL0) 3852 .allPrivileges(); 3853// .mapsTo(MISCREG_PMEVTYPER4); 3854 InitReg(MISCREG_PMEVTYPER5_EL0) 3855 .allPrivileges(); 3856// .mapsTo(MISCREG_PMEVTYPER5); 3857 InitReg(MISCREG_CNTVOFF_EL2) 3858 .hyp().mon() 3859 .mapsTo(MISCREG_CNTVOFF); /* 64b */ 3860 InitReg(MISCREG_CNTHCTL_EL2) 3861 .unimplemented() 3862 .warnNotFail() 3863 .mon().monNonSecureWrite(0).hypWrite() 3864 .mapsTo(MISCREG_CNTHCTL); 3865 InitReg(MISCREG_CNTHP_TVAL_EL2) 3866 .unimplemented() 3867 .mon().monNonSecureWrite(0).hypWrite() 3868 .mapsTo(MISCREG_CNTHP_TVAL); 3869 InitReg(MISCREG_CNTHP_CTL_EL2) 3870 .unimplemented() 3871 .mon().monNonSecureWrite(0).hypWrite() 3872 .mapsTo(MISCREG_CNTHP_CTL); 3873 InitReg(MISCREG_CNTHP_CVAL_EL2) 3874 .unimplemented() 3875 .mon().monNonSecureWrite(0).hypWrite() 3876 .mapsTo(MISCREG_CNTHP_CVAL); /* 64b */ 3877 InitReg(MISCREG_CNTPS_TVAL_EL1) 3878 .unimplemented() 3879 .mon().monNonSecureWrite(0).hypWrite(); 3880 InitReg(MISCREG_CNTPS_CTL_EL1) 3881 .unimplemented() 3882 .mon().monNonSecureWrite(0).hypWrite(); 3883 InitReg(MISCREG_CNTPS_CVAL_EL1) 3884 .unimplemented() 3885 .mon().monNonSecureWrite(0).hypWrite(); 3886 InitReg(MISCREG_IL1DATA0_EL1) 3887 .allPrivileges().exceptUserMode(); 3888 InitReg(MISCREG_IL1DATA1_EL1) 3889 .allPrivileges().exceptUserMode(); 3890 InitReg(MISCREG_IL1DATA2_EL1) 3891 .allPrivileges().exceptUserMode(); 3892 InitReg(MISCREG_IL1DATA3_EL1) 3893 .allPrivileges().exceptUserMode(); 3894 InitReg(MISCREG_DL1DATA0_EL1) 3895 .allPrivileges().exceptUserMode(); 3896 InitReg(MISCREG_DL1DATA1_EL1) 3897 .allPrivileges().exceptUserMode(); 3898 InitReg(MISCREG_DL1DATA2_EL1) 3899 .allPrivileges().exceptUserMode(); 3900 InitReg(MISCREG_DL1DATA3_EL1) 3901 .allPrivileges().exceptUserMode(); 3902 InitReg(MISCREG_DL1DATA4_EL1) 3903 .allPrivileges().exceptUserMode(); 3904 InitReg(MISCREG_L2ACTLR_EL1) 3905 .allPrivileges().exceptUserMode(); 3906 InitReg(MISCREG_CPUACTLR_EL1) 3907 .allPrivileges().exceptUserMode(); 3908 InitReg(MISCREG_CPUECTLR_EL1) 3909 .allPrivileges().exceptUserMode(); 3910 InitReg(MISCREG_CPUMERRSR_EL1) 3911 .allPrivileges().exceptUserMode(); 3912 InitReg(MISCREG_L2MERRSR_EL1) 3913 .unimplemented() 3914 .warnNotFail() 3915 .allPrivileges().exceptUserMode(); 3916 InitReg(MISCREG_CBAR_EL1) 3917 .allPrivileges().exceptUserMode().writes(0); 3918 InitReg(MISCREG_CONTEXTIDR_EL2) 3919 .mon().hyp(); 3920 3921 // Dummy registers 3922 InitReg(MISCREG_NOP) 3923 .allPrivileges(); 3924 InitReg(MISCREG_RAZ) 3925 .allPrivileges().exceptUserMode().writes(0); 3926 InitReg(MISCREG_CP14_UNIMPL) 3927 .unimplemented() 3928 .warnNotFail(); 3929 InitReg(MISCREG_CP15_UNIMPL) 3930 .unimplemented() 3931 .warnNotFail(); 3932 InitReg(MISCREG_A64_UNIMPL) 3933 .unimplemented() 3934 .warnNotFail(); 3935 InitReg(MISCREG_UNKNOWN); 3936 3937 // Register mappings for some unimplemented registers: 3938 // ESR_EL1 -> DFSR 3939 // RMR_EL1 -> RMR 3940 // RMR_EL2 -> HRMR 3941 // DBGDTR_EL0 -> DBGDTR{R or T}Xint 3942 // DBGDTRRX_EL0 -> DBGDTRRXint 3943 // DBGDTRTX_EL0 -> DBGDTRRXint 3944 // MDCR_EL3 -> SDCR, NAM D7-2108 (the latter is unimpl. in gem5) 3945 3946 completed = true; 3947} 3948 3949} // namespace ArmISA 3950