isa.cc (13550:976591c112bc) | isa.cc (13581:b6dcd0183747) |
---|---|
1/* 2 * Copyright (c) 2010-2018 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 377 unchanged lines hidden (view full) --- 386 if (gicv3) { 387 gicv3CpuInterface.reset(gicv3->getCPUInterface(tc->contextId())); 388 gicv3CpuInterface->setISA(this); 389 } 390 } 391} 392 393 | 1/* 2 * Copyright (c) 2010-2018 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 377 unchanged lines hidden (view full) --- 386 if (gicv3) { 387 gicv3CpuInterface.reset(gicv3->getCPUInterface(tc->contextId())); 388 gicv3CpuInterface->setISA(this); 389 } 390 } 391} 392 393 |
394MiscReg | 394RegVal |
395ISA::readMiscRegNoEffect(int misc_reg) const 396{ 397 assert(misc_reg < NumMiscRegs); 398 399 const auto ® = lookUpMiscReg[misc_reg]; // bit masks 400 const auto &map = getMiscIndices(misc_reg); 401 int lower = map.first, upper = map.second; 402 // NB!: apply architectural masks according to desired register, --- 7 unchanged lines hidden (view full) --- 410 if ((val & reg.res1()) != reg.res1()) { 411 DPRINTF(MiscRegs, "Reading MiscReg %s with clear res1 bits: %#x\n", 412 miscRegName[misc_reg], (val & reg.res1()) ^ reg.res1()); 413 } 414 return (val & ~reg.raz()) | reg.rao(); // enforce raz/rao 415} 416 417 | 395ISA::readMiscRegNoEffect(int misc_reg) const 396{ 397 assert(misc_reg < NumMiscRegs); 398 399 const auto ® = lookUpMiscReg[misc_reg]; // bit masks 400 const auto &map = getMiscIndices(misc_reg); 401 int lower = map.first, upper = map.second; 402 // NB!: apply architectural masks according to desired register, --- 7 unchanged lines hidden (view full) --- 410 if ((val & reg.res1()) != reg.res1()) { 411 DPRINTF(MiscRegs, "Reading MiscReg %s with clear res1 bits: %#x\n", 412 miscRegName[misc_reg], (val & reg.res1()) ^ reg.res1()); 413 } 414 return (val & ~reg.raz()) | reg.rao(); // enforce raz/rao 415} 416 417 |
418MiscReg | 418RegVal |
419ISA::readMiscReg(int misc_reg, ThreadContext *tc) 420{ 421 CPSR cpsr = 0; 422 PCState pc = 0; 423 SCR scr = 0; 424 425 if (misc_reg == MISCREG_CPSR) { 426 cpsr = miscRegs[misc_reg]; --- 38 unchanged lines hidden (view full) --- 465 cpsr = readMiscRegNoEffect(MISCREG_CPSR); 466 if (scr.ns && (cpsr.mode != MODE_MON) && ELIs32(tc, EL3)) { 467 NSACR nsacr = readMiscRegNoEffect(MISCREG_NSACR); 468 // NB: Skipping the full loop, here 469 if (!nsacr.cp10) cpacrMask.cp10 = 0; 470 if (!nsacr.cp11) cpacrMask.cp11 = 0; 471 } 472 } | 419ISA::readMiscReg(int misc_reg, ThreadContext *tc) 420{ 421 CPSR cpsr = 0; 422 PCState pc = 0; 423 SCR scr = 0; 424 425 if (misc_reg == MISCREG_CPSR) { 426 cpsr = miscRegs[misc_reg]; --- 38 unchanged lines hidden (view full) --- 465 cpsr = readMiscRegNoEffect(MISCREG_CPSR); 466 if (scr.ns && (cpsr.mode != MODE_MON) && ELIs32(tc, EL3)) { 467 NSACR nsacr = readMiscRegNoEffect(MISCREG_NSACR); 468 // NB: Skipping the full loop, here 469 if (!nsacr.cp10) cpacrMask.cp10 = 0; 470 if (!nsacr.cp11) cpacrMask.cp11 = 0; 471 } 472 } |
473 MiscReg val = readMiscRegNoEffect(MISCREG_CPACR); | 473 RegVal val = readMiscRegNoEffect(MISCREG_CPACR); |
474 val &= cpacrMask; 475 DPRINTF(MiscRegs, "Reading misc reg %s: %#x\n", 476 miscRegName[misc_reg], val); 477 return val; 478 } 479 case MISCREG_MPIDR: 480 case MISCREG_MPIDR_EL1: 481 return readMPIDR(system, tc); --- 160 unchanged lines hidden (view full) --- 642 return tc->getCpuPtr()->getInterruptController(tc->threadId())->getISR( 643 readMiscRegNoEffect(MISCREG_HCR_EL2), 644 readMiscRegNoEffect(MISCREG_CPSR), 645 readMiscRegNoEffect(MISCREG_SCR_EL3)); 646 case MISCREG_DCZID_EL0: 647 return 0x04; // DC ZVA clear 64-byte chunks 648 case MISCREG_HCPTR: 649 { | 474 val &= cpacrMask; 475 DPRINTF(MiscRegs, "Reading misc reg %s: %#x\n", 476 miscRegName[misc_reg], val); 477 return val; 478 } 479 case MISCREG_MPIDR: 480 case MISCREG_MPIDR_EL1: 481 return readMPIDR(system, tc); --- 160 unchanged lines hidden (view full) --- 642 return tc->getCpuPtr()->getInterruptController(tc->threadId())->getISR( 643 readMiscRegNoEffect(MISCREG_HCR_EL2), 644 readMiscRegNoEffect(MISCREG_CPSR), 645 readMiscRegNoEffect(MISCREG_SCR_EL3)); 646 case MISCREG_DCZID_EL0: 647 return 0x04; // DC ZVA clear 64-byte chunks 648 case MISCREG_HCPTR: 649 { |
650 MiscReg val = readMiscRegNoEffect(misc_reg); | 650 RegVal val = readMiscRegNoEffect(misc_reg); |
651 // The trap bit associated with CP14 is defined as RAZ 652 val &= ~(1 << 14); 653 // If a CP bit in NSACR is 0 then the corresponding bit in 654 // HCPTR is RAO/WI 655 bool secure_lookup = haveSecurity && 656 inSecureState(readMiscRegNoEffect(MISCREG_SCR), 657 readMiscRegNoEffect(MISCREG_CPSR)); 658 if (!secure_lookup) { | 651 // The trap bit associated with CP14 is defined as RAZ 652 val &= ~(1 << 14); 653 // If a CP bit in NSACR is 0 then the corresponding bit in 654 // HCPTR is RAO/WI 655 bool secure_lookup = haveSecurity && 656 inSecureState(readMiscRegNoEffect(MISCREG_SCR), 657 readMiscRegNoEffect(MISCREG_CPSR)); 658 if (!secure_lookup) { |
659 MiscReg mask = readMiscRegNoEffect(MISCREG_NSACR); | 659 RegVal mask = readMiscRegNoEffect(MISCREG_NSACR); |
660 val |= (mask ^ 0x7FFF) & 0xBFFF; 661 } 662 // Set the bits for unimplemented coprocessors to RAO/WI 663 val |= 0x33FF; 664 return (val); 665 } 666 case MISCREG_HDFAR: // alias for secure DFAR 667 return readMiscRegNoEffect(MISCREG_DFAR_S); --- 37 unchanged lines hidden (view full) --- 705 default: 706 break; 707 708 } 709 return readMiscRegNoEffect(misc_reg); 710} 711 712void | 660 val |= (mask ^ 0x7FFF) & 0xBFFF; 661 } 662 // Set the bits for unimplemented coprocessors to RAO/WI 663 val |= 0x33FF; 664 return (val); 665 } 666 case MISCREG_HDFAR: // alias for secure DFAR 667 return readMiscRegNoEffect(MISCREG_DFAR_S); --- 37 unchanged lines hidden (view full) --- 705 default: 706 break; 707 708 } 709 return readMiscRegNoEffect(misc_reg); 710} 711 712void |
713ISA::setMiscRegNoEffect(int misc_reg, const MiscReg &val) | 713ISA::setMiscRegNoEffect(int misc_reg, const RegVal &val) |
714{ 715 assert(misc_reg < NumMiscRegs); 716 717 const auto ® = lookUpMiscReg[misc_reg]; // bit masks 718 const auto &map = getMiscIndices(misc_reg); 719 int lower = map.first, upper = map.second; 720 721 auto v = (val & ~reg.wi()) | reg.rao(); --- 5 unchanged lines hidden (view full) --- 727 } else { 728 miscRegs[lower] = v; 729 DPRINTF(MiscRegs, "Writing to misc reg %d (%d) : %#x\n", 730 misc_reg, lower, v); 731 } 732} 733 734void | 714{ 715 assert(misc_reg < NumMiscRegs); 716 717 const auto ® = lookUpMiscReg[misc_reg]; // bit masks 718 const auto &map = getMiscIndices(misc_reg); 719 int lower = map.first, upper = map.second; 720 721 auto v = (val & ~reg.wi()) | reg.rao(); --- 5 unchanged lines hidden (view full) --- 727 } else { 728 miscRegs[lower] = v; 729 DPRINTF(MiscRegs, "Writing to misc reg %d (%d) : %#x\n", 730 misc_reg, lower, v); 731 } 732} 733 734void |
735ISA::setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc) | 735ISA::setMiscReg(int misc_reg, const RegVal &val, ThreadContext *tc) |
736{ 737 | 736{ 737 |
738 MiscReg newVal = val; | 738 RegVal newVal = val; |
739 bool secure_lookup; 740 SCR scr; 741 742 if (misc_reg == MISCREG_CPSR) { 743 updateRegMap(val); 744 745 746 CPSR old_cpsr = miscRegs[MISCREG_CPSR]; --- 49 unchanged lines hidden (view full) --- 796 if (scr.ns && (cpsr.mode != MODE_MON) && ELIs32(tc, EL3)) { 797 NSACR nsacr = readMiscRegNoEffect(MISCREG_NSACR); 798 // NB: Skipping the full loop, here 799 if (!nsacr.cp10) cpacrMask.cp10 = 0; 800 if (!nsacr.cp11) cpacrMask.cp11 = 0; 801 } 802 } 803 | 739 bool secure_lookup; 740 SCR scr; 741 742 if (misc_reg == MISCREG_CPSR) { 743 updateRegMap(val); 744 745 746 CPSR old_cpsr = miscRegs[MISCREG_CPSR]; --- 49 unchanged lines hidden (view full) --- 796 if (scr.ns && (cpsr.mode != MODE_MON) && ELIs32(tc, EL3)) { 797 NSACR nsacr = readMiscRegNoEffect(MISCREG_NSACR); 798 // NB: Skipping the full loop, here 799 if (!nsacr.cp10) cpacrMask.cp10 = 0; 800 if (!nsacr.cp11) cpacrMask.cp11 = 0; 801 } 802 } 803 |
804 MiscReg old_val = readMiscRegNoEffect(MISCREG_CPACR); | 804 RegVal old_val = readMiscRegNoEffect(MISCREG_CPACR); |
805 newVal &= cpacrMask; 806 newVal |= old_val & ~cpacrMask; 807 DPRINTF(MiscRegs, "Writing misc reg %s: %#x\n", 808 miscRegName[misc_reg], newVal); 809 } 810 break; 811 case MISCREG_CPTR_EL2: 812 { --- 176 unchanged lines hidden (view full) --- 989 sctlr_idx = MISCREG_SCTLR_S; 990 } else { 991 sctlr_idx = MISCREG_SCTLR_NS; 992 } 993 994 SCTLR sctlr = miscRegs[sctlr_idx]; 995 SCTLR new_sctlr = newVal; 996 new_sctlr.nmfi = ((bool)sctlr.nmfi) && !haveVirtualization; | 805 newVal &= cpacrMask; 806 newVal |= old_val & ~cpacrMask; 807 DPRINTF(MiscRegs, "Writing misc reg %s: %#x\n", 808 miscRegName[misc_reg], newVal); 809 } 810 break; 811 case MISCREG_CPTR_EL2: 812 { --- 176 unchanged lines hidden (view full) --- 989 sctlr_idx = MISCREG_SCTLR_S; 990 } else { 991 sctlr_idx = MISCREG_SCTLR_NS; 992 } 993 994 SCTLR sctlr = miscRegs[sctlr_idx]; 995 SCTLR new_sctlr = newVal; 996 new_sctlr.nmfi = ((bool)sctlr.nmfi) && !haveVirtualization; |
997 miscRegs[sctlr_idx] = (MiscReg)new_sctlr; | 997 miscRegs[sctlr_idx] = (RegVal)new_sctlr; |
998 getITBPtr(tc)->invalidateMiscReg(); 999 getDTBPtr(tc)->invalidateMiscReg(); 1000 } 1001 case MISCREG_MIDR: 1002 case MISCREG_ID_PFR0: 1003 case MISCREG_ID_PFR1: 1004 case MISCREG_ID_DFR0: 1005 case MISCREG_ID_MMFR0: --- 552 unchanged lines hidden (view full) --- 1558 case MISCREG_HCPTR: 1559 { 1560 // If a CP bit in NSACR is 0 then the corresponding bit in 1561 // HCPTR is RAO/WI. Same applies to NSASEDIS 1562 secure_lookup = haveSecurity && 1563 inSecureState(readMiscRegNoEffect(MISCREG_SCR), 1564 readMiscRegNoEffect(MISCREG_CPSR)); 1565 if (!secure_lookup) { | 998 getITBPtr(tc)->invalidateMiscReg(); 999 getDTBPtr(tc)->invalidateMiscReg(); 1000 } 1001 case MISCREG_MIDR: 1002 case MISCREG_ID_PFR0: 1003 case MISCREG_ID_PFR1: 1004 case MISCREG_ID_DFR0: 1005 case MISCREG_ID_MMFR0: --- 552 unchanged lines hidden (view full) --- 1558 case MISCREG_HCPTR: 1559 { 1560 // If a CP bit in NSACR is 0 then the corresponding bit in 1561 // HCPTR is RAO/WI. Same applies to NSASEDIS 1562 secure_lookup = haveSecurity && 1563 inSecureState(readMiscRegNoEffect(MISCREG_SCR), 1564 readMiscRegNoEffect(MISCREG_CPSR)); 1565 if (!secure_lookup) { |
1566 MiscReg oldValue = readMiscRegNoEffect(MISCREG_HCPTR); 1567 MiscReg mask = (readMiscRegNoEffect(MISCREG_NSACR) ^ 0x7FFF) & 0xBFFF; | 1566 RegVal oldValue = readMiscRegNoEffect(MISCREG_HCPTR); 1567 RegVal mask = 1568 (readMiscRegNoEffect(MISCREG_NSACR) ^ 0x7FFF) & 0xBFFF; |
1568 newVal = (newVal & ~mask) | (oldValue & mask); 1569 } 1570 break; 1571 } 1572 case MISCREG_HDFAR: // alias for secure DFAR 1573 misc_reg = MISCREG_DFAR_S; 1574 break; 1575 case MISCREG_HIFAR: // alias for secure IFAR --- 88 unchanged lines hidden (view full) --- 1664 tc->pcState().pc(), tc->contextId()); 1665 1666 fault = getDTBPtr(tc)->translateFunctional( 1667 req, tc, mode, tranType); 1668 1669 TTBCR ttbcr = readMiscRegNoEffect(MISCREG_TTBCR); 1670 HCR hcr = readMiscRegNoEffect(MISCREG_HCR); 1671 | 1569 newVal = (newVal & ~mask) | (oldValue & mask); 1570 } 1571 break; 1572 } 1573 case MISCREG_HDFAR: // alias for secure DFAR 1574 misc_reg = MISCREG_DFAR_S; 1575 break; 1576 case MISCREG_HIFAR: // alias for secure IFAR --- 88 unchanged lines hidden (view full) --- 1665 tc->pcState().pc(), tc->contextId()); 1666 1667 fault = getDTBPtr(tc)->translateFunctional( 1668 req, tc, mode, tranType); 1669 1670 TTBCR ttbcr = readMiscRegNoEffect(MISCREG_TTBCR); 1671 HCR hcr = readMiscRegNoEffect(MISCREG_HCR); 1672 |
1672 MiscReg newVal; | 1673 RegVal newVal; |
1673 if (fault == NoFault) { 1674 Addr paddr = req->getPaddr(); 1675 if (haveLPAE && (ttbcr.eae || tranType & TLB::HypMode || 1676 ((tranType & TLB::S1S2NsTran) && hcr.vm) )) { 1677 newVal = (paddr & mask(39, 12)) | 1678 (getDTBPtr(tc)->getAttr()); 1679 } else { 1680 newVal = (paddr & 0xfffff000) | --- 237 unchanged lines hidden (view full) --- 1918 miscRegName[misc_reg]); 1919 1920 req->setVirt(0, val, 0, flags, Request::funcMasterId, 1921 tc->pcState().pc()); 1922 req->setContext(tc->contextId()); 1923 fault = getDTBPtr(tc)->translateFunctional(req, tc, mode, 1924 tranType); 1925 | 1674 if (fault == NoFault) { 1675 Addr paddr = req->getPaddr(); 1676 if (haveLPAE && (ttbcr.eae || tranType & TLB::HypMode || 1677 ((tranType & TLB::S1S2NsTran) && hcr.vm) )) { 1678 newVal = (paddr & mask(39, 12)) | 1679 (getDTBPtr(tc)->getAttr()); 1680 } else { 1681 newVal = (paddr & 0xfffff000) | --- 237 unchanged lines hidden (view full) --- 1919 miscRegName[misc_reg]); 1920 1921 req->setVirt(0, val, 0, flags, Request::funcMasterId, 1922 tc->pcState().pc()); 1923 req->setContext(tc->contextId()); 1924 fault = getDTBPtr(tc)->translateFunctional(req, tc, mode, 1925 tranType); 1926 |
1926 MiscReg newVal; | 1927 RegVal newVal; |
1927 if (fault == NoFault) { 1928 Addr paddr = req->getPaddr(); 1929 uint64_t attr = getDTBPtr(tc)->getAttr(); 1930 uint64_t attr1 = attr >> 56; 1931 if (!attr1 || attr1 ==0x44) { 1932 attr |= 0x100; 1933 attr &= ~ uint64_t(0x80); 1934 } --- 99 unchanged lines hidden --- | 1928 if (fault == NoFault) { 1929 Addr paddr = req->getPaddr(); 1930 uint64_t attr = getDTBPtr(tc)->getAttr(); 1931 uint64_t attr1 = attr >> 56; 1932 if (!attr1 || attr1 ==0x44) { 1933 attr |= 0x100; 1934 attr &= ~ uint64_t(0x80); 1935 } --- 99 unchanged lines hidden --- |