isa.cc revision 7583
12381SN/A/* 28853Sandreas.hansson@arm.com * Copyright (c) 2010 ARM Limited 38711Sandreas.hansson@arm.com * All rights reserved 48711Sandreas.hansson@arm.com * 58711Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 68711Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 78711Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 88711Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 98711Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 108711Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 118711Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 128711Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 138711Sandreas.hansson@arm.com * 142381SN/A * Redistribution and use in source and binary forms, with or without 152381SN/A * modification, are permitted provided that the following conditions are 162381SN/A * met: redistributions of source code must retain the above copyright 172381SN/A * notice, this list of conditions and the following disclaimer; 182381SN/A * redistributions in binary form must reproduce the above copyright 192381SN/A * notice, this list of conditions and the following disclaimer in the 202381SN/A * documentation and/or other materials provided with the distribution; 212381SN/A * neither the name of the copyright holders nor the names of its 222381SN/A * contributors may be used to endorse or promote products derived from 232381SN/A * this software without specific prior written permission. 242381SN/A * 252381SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 262381SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 272381SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 282381SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 292381SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 302381SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 312381SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 322381SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 332381SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 342381SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 352381SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 362381SN/A * 372381SN/A * Authors: Gabe Black 382381SN/A * Ali Saidi 392665Ssaidi@eecs.umich.edu */ 402665Ssaidi@eecs.umich.edu 418853Sandreas.hansson@arm.com#include "arch/arm/isa.hh" 428922Swilliam.wang@arm.com 432381SN/Anamespace ArmISA 442381SN/A{ 452381SN/A 462381SN/Avoid 478922Swilliam.wang@arm.comISA::clear() 482381SN/A{ 492381SN/A SCTLR sctlr_rst = miscRegs[MISCREG_SCTLR_RST]; 502381SN/A 512381SN/A memset(miscRegs, 0, sizeof(miscRegs)); 522381SN/A CPSR cpsr = 0; 532381SN/A cpsr.mode = MODE_USER; 542381SN/A miscRegs[MISCREG_CPSR] = cpsr; 552381SN/A updateRegMap(cpsr); 562381SN/A 572381SN/A SCTLR sctlr = 0; 588922Swilliam.wang@arm.com sctlr.nmfi = (bool)sctlr_rst.nmfi; 598922Swilliam.wang@arm.com sctlr.v = (bool)sctlr_rst.v; 602407SN/A sctlr.u = 1; 612407SN/A sctlr.xp = 1; 622407SN/A sctlr.rao2 = 1; 632407SN/A sctlr.rao3 = 1; 642407SN/A sctlr.rao4 = 1; 652407SN/A miscRegs[MISCREG_SCTLR] = sctlr; 662521SN/A miscRegs[MISCREG_SCTLR_RST] = sctlr_rst; 672407SN/A 683401Sktlim@umich.edu 693401Sktlim@umich.edu /* 702381SN/A * Technically this should be 0, but we don't support those 718922Swilliam.wang@arm.com * settings. 728922Swilliam.wang@arm.com */ 739087Sandreas.hansson@arm.com CPACR cpacr = 0; 742381SN/A // Enable CP 10, 11 758708Sandreas.hansson@arm.com cpacr.cp10 = 0x3; 762381SN/A cpacr.cp11 = 0x3; 778922Swilliam.wang@arm.com miscRegs[MISCREG_CPACR] = cpacr; 788922Swilliam.wang@arm.com 798922Swilliam.wang@arm.com /* Start with an event in the mailbox */ 808922Swilliam.wang@arm.com miscRegs[MISCREG_SEV_MAILBOX] = 1; 818922Swilliam.wang@arm.com 828922Swilliam.wang@arm.com /* 835476Snate@binkert.org * Implemented = '5' from "M5", 842640Sstever@eecs.umich.edu * Variant = 0, 858965Sandreas.hansson@arm.com */ 868965Sandreas.hansson@arm.com miscRegs[MISCREG_MIDR] = 879031Sandreas.hansson@arm.com (0x35 << 24) | //Implementor is '5' from "M5" 888965Sandreas.hansson@arm.com (0 << 20) | //Variant 899031Sandreas.hansson@arm.com (0xf << 16) | //Architecture from CPUID scheme 908965Sandreas.hansson@arm.com (0 << 4) | //Primary part number 918922Swilliam.wang@arm.com (0 << 0) | //Revision 928922Swilliam.wang@arm.com 0; 938922Swilliam.wang@arm.com 948922Swilliam.wang@arm.com // Separate Instruction and Data TLBs. 958922Swilliam.wang@arm.com miscRegs[MISCREG_TLBTR] = 1; 968922Swilliam.wang@arm.com 978922Swilliam.wang@arm.com MVFR0 mvfr0 = 0; 988922Swilliam.wang@arm.com mvfr0.advSimdRegisters = 2; 998965Sandreas.hansson@arm.com mvfr0.singlePrecision = 2; 1008922Swilliam.wang@arm.com mvfr0.doublePrecision = 2; 1019031Sandreas.hansson@arm.com mvfr0.vfpExceptionTrapping = 0; 1028922Swilliam.wang@arm.com mvfr0.divide = 1; 1038922Swilliam.wang@arm.com mvfr0.squareRoot = 1; 1048922Swilliam.wang@arm.com mvfr0.shortVectors = 1; 1058922Swilliam.wang@arm.com mvfr0.roundingModes = 1; 1068922Swilliam.wang@arm.com miscRegs[MISCREG_MVFR0] = mvfr0; 1073401Sktlim@umich.edu 1082381SN/A MVFR1 mvfr1 = 0; 1092640Sstever@eecs.umich.edu mvfr1.flushToZero = 1; 1102640Sstever@eecs.umich.edu mvfr1.defaultNaN = 1; 1118922Swilliam.wang@arm.com mvfr1.advSimdLoadStore = 1; 1124190Ssaidi@eecs.umich.edu mvfr1.advSimdInteger = 1; 1138965Sandreas.hansson@arm.com mvfr1.advSimdSinglePrecision = 1; 1149031Sandreas.hansson@arm.com mvfr1.advSimdHalfPrecision = 1; 1158965Sandreas.hansson@arm.com mvfr1.vfpHalfPrecision = 1; 1168922Swilliam.wang@arm.com miscRegs[MISCREG_MVFR1] = mvfr1; 1178922Swilliam.wang@arm.com 1188922Swilliam.wang@arm.com miscRegs[MISCREG_MPIDR] = 0; 1198922Swilliam.wang@arm.com 1208922Swilliam.wang@arm.com // Reset values of PRRR and NMRR are implementation dependent 1218922Swilliam.wang@arm.com 1228922Swilliam.wang@arm.com miscRegs[MISCREG_PRRR] = 1238922Swilliam.wang@arm.com (1 << 19) | // 19 1248922Swilliam.wang@arm.com (0 << 18) | // 18 1258922Swilliam.wang@arm.com (0 << 17) | // 17 1268922Swilliam.wang@arm.com (1 << 16) | // 16 1278922Swilliam.wang@arm.com (2 << 14) | // 15:14 1288922Swilliam.wang@arm.com (0 << 12) | // 13:12 1298922Swilliam.wang@arm.com (2 << 10) | // 11:10 1308975Sandreas.hansson@arm.com (2 << 8) | // 9:8 1318975Sandreas.hansson@arm.com (2 << 6) | // 7:6 1328922Swilliam.wang@arm.com (2 << 4) | // 5:4 1338922Swilliam.wang@arm.com (1 << 2) | // 3:2 1348922Swilliam.wang@arm.com 0; // 1:0 1358922Swilliam.wang@arm.com miscRegs[MISCREG_NMRR] = 1368922Swilliam.wang@arm.com (1 << 30) | // 31:30 1378922Swilliam.wang@arm.com (0 << 26) | // 27:26 1388965Sandreas.hansson@arm.com (0 << 24) | // 25:24 1399031Sandreas.hansson@arm.com (3 << 22) | // 23:22 1408922Swilliam.wang@arm.com (2 << 20) | // 21:20 1418922Swilliam.wang@arm.com (0 << 18) | // 19:18 1428922Swilliam.wang@arm.com (0 << 16) | // 17:16 1438922Swilliam.wang@arm.com (1 << 14) | // 15:14 1448922Swilliam.wang@arm.com (0 << 12) | // 13:12 1458922Swilliam.wang@arm.com (2 << 10) | // 11:10 1468922Swilliam.wang@arm.com (0 << 8) | // 9:8 1478948Sandreas.hansson@arm.com (3 << 6) | // 7:6 1488948Sandreas.hansson@arm.com (2 << 4) | // 5:4 1498948Sandreas.hansson@arm.com (0 << 2) | // 3:2 1508948Sandreas.hansson@arm.com 0; // 1:0 1518948Sandreas.hansson@arm.com 1528948Sandreas.hansson@arm.com //XXX We need to initialize the rest of the state. 1538948Sandreas.hansson@arm.com} 1548948Sandreas.hansson@arm.com 1558948Sandreas.hansson@arm.comMiscReg 1568948Sandreas.hansson@arm.comISA::readMiscRegNoEffect(int misc_reg) 1578948Sandreas.hansson@arm.com{ 1588948Sandreas.hansson@arm.com assert(misc_reg < NumMiscRegs); 1598948Sandreas.hansson@arm.com if (misc_reg == MISCREG_SPSR) { 1608948Sandreas.hansson@arm.com CPSR cpsr = miscRegs[MISCREG_CPSR]; 1618948Sandreas.hansson@arm.com switch (cpsr.mode) { 1628948Sandreas.hansson@arm.com case MODE_USER: 1638948Sandreas.hansson@arm.com return miscRegs[MISCREG_SPSR]; 1648948Sandreas.hansson@arm.com case MODE_FIQ: 1658948Sandreas.hansson@arm.com return miscRegs[MISCREG_SPSR_FIQ]; 1668948Sandreas.hansson@arm.com case MODE_IRQ: 1678975Sandreas.hansson@arm.com return miscRegs[MISCREG_SPSR_IRQ]; 1688975Sandreas.hansson@arm.com case MODE_SVC: 1698975Sandreas.hansson@arm.com return miscRegs[MISCREG_SPSR_SVC]; 1708975Sandreas.hansson@arm.com case MODE_MON: 1718975Sandreas.hansson@arm.com return miscRegs[MISCREG_SPSR_MON]; 1728975Sandreas.hansson@arm.com case MODE_ABORT: 1738975Sandreas.hansson@arm.com return miscRegs[MISCREG_SPSR_ABT]; 1748975Sandreas.hansson@arm.com case MODE_UNDEFINED: 1758975Sandreas.hansson@arm.com return miscRegs[MISCREG_SPSR_UND]; 1768975Sandreas.hansson@arm.com default: 1778975Sandreas.hansson@arm.com return miscRegs[MISCREG_SPSR]; 1788948Sandreas.hansson@arm.com } 1798948Sandreas.hansson@arm.com } 1808975Sandreas.hansson@arm.com return miscRegs[misc_reg]; 1818975Sandreas.hansson@arm.com} 1828975Sandreas.hansson@arm.com 1838975Sandreas.hansson@arm.com 1848975Sandreas.hansson@arm.comMiscReg 1858975Sandreas.hansson@arm.comISA::readMiscReg(int misc_reg, ThreadContext *tc) 1868975Sandreas.hansson@arm.com{ 1878948Sandreas.hansson@arm.com if (misc_reg == MISCREG_CPSR) { 1888975Sandreas.hansson@arm.com CPSR cpsr = miscRegs[misc_reg]; 1898922Swilliam.wang@arm.com Addr pc = tc->readPC(); 1908922Swilliam.wang@arm.com if (pc & (ULL(1) << PcJBitShift)) 1919087Sandreas.hansson@arm.com cpsr.j = 1; 1929087Sandreas.hansson@arm.com else 1939087Sandreas.hansson@arm.com cpsr.j = 0; 1949087Sandreas.hansson@arm.com if (pc & (ULL(1) << PcTBitShift)) 1959087Sandreas.hansson@arm.com cpsr.t = 1; 1969087Sandreas.hansson@arm.com else 1978922Swilliam.wang@arm.com cpsr.t = 0; 1988711Sandreas.hansson@arm.com return cpsr; 1998922Swilliam.wang@arm.com } 2008922Swilliam.wang@arm.com if (misc_reg >= MISCREG_CP15_UNIMP_START && 2018922Swilliam.wang@arm.com misc_reg < MISCREG_CP15_END) { 2028711Sandreas.hansson@arm.com panic("Unimplemented CP15 register %s read.\n", 2038711Sandreas.hansson@arm.com miscRegName[misc_reg]); 2048711Sandreas.hansson@arm.com } 2058922Swilliam.wang@arm.com switch (misc_reg) { 2062381SN/A case MISCREG_CLIDR: 2078711Sandreas.hansson@arm.com warn("The clidr register always reports 0 caches.\n"); 2088922Swilliam.wang@arm.com break; 2098922Swilliam.wang@arm.com case MISCREG_CCSIDR: 2108711Sandreas.hansson@arm.com warn("The ccsidr register isn't implemented and " 2118922Swilliam.wang@arm.com "always reads as 0.\n"); 2122381SN/A break; 2132381SN/A case MISCREG_ID_PFR0: 2142381SN/A return 0x1031; // ThumbEE | !Jazelle | Thumb | ARM 2152381SN/A case MISCREG_ID_MMFR0: 2168922Swilliam.wang@arm.com return 0x03; //VMSAz7 2172381SN/A case MISCREG_CTR: 2185314Sstever@gmail.com return 0x86468006; // V7, 64 byte cache line, load/exclusive is exact 2195314Sstever@gmail.com case MISCREG_ACTLR: 2205314Sstever@gmail.com warn("Not doing anything for miscreg ACTLR\n"); 2215314Sstever@gmail.com break; 2228975Sandreas.hansson@arm.com case MISCREG_PMCR: 2238975Sandreas.hansson@arm.com case MISCREG_PMCCNTR: 2248975Sandreas.hansson@arm.com case MISCREG_PMSELR: 2258975Sandreas.hansson@arm.com warn("Not doing anyhting for read to miscreg %s\n", 2268975Sandreas.hansson@arm.com miscRegName[misc_reg]); 2278975Sandreas.hansson@arm.com break; 2288975Sandreas.hansson@arm.com 2298975Sandreas.hansson@arm.com } 2308975Sandreas.hansson@arm.com return readMiscRegNoEffect(misc_reg); 2318975Sandreas.hansson@arm.com} 2328975Sandreas.hansson@arm.com 2338975Sandreas.hansson@arm.comvoid 2348975Sandreas.hansson@arm.comISA::setMiscRegNoEffect(int misc_reg, const MiscReg &val) 2358975Sandreas.hansson@arm.com{ 2368975Sandreas.hansson@arm.com assert(misc_reg < NumMiscRegs); 2378975Sandreas.hansson@arm.com if (misc_reg == MISCREG_SPSR) { 2388975Sandreas.hansson@arm.com CPSR cpsr = miscRegs[MISCREG_CPSR]; 2398975Sandreas.hansson@arm.com switch (cpsr.mode) { 2408975Sandreas.hansson@arm.com case MODE_USER: 2418975Sandreas.hansson@arm.com miscRegs[MISCREG_SPSR] = val; 2428975Sandreas.hansson@arm.com return; 2438975Sandreas.hansson@arm.com case MODE_FIQ: 2448975Sandreas.hansson@arm.com miscRegs[MISCREG_SPSR_FIQ] = val; 2458975Sandreas.hansson@arm.com return; 2468975Sandreas.hansson@arm.com case MODE_IRQ: 2478975Sandreas.hansson@arm.com miscRegs[MISCREG_SPSR_IRQ] = val; 2488975Sandreas.hansson@arm.com return; 2498975Sandreas.hansson@arm.com case MODE_SVC: 2508975Sandreas.hansson@arm.com miscRegs[MISCREG_SPSR_SVC] = val; 2518975Sandreas.hansson@arm.com return; 2528975Sandreas.hansson@arm.com case MODE_MON: 2538975Sandreas.hansson@arm.com miscRegs[MISCREG_SPSR_MON] = val; 2548975Sandreas.hansson@arm.com return; 2558975Sandreas.hansson@arm.com case MODE_ABORT: 2569087Sandreas.hansson@arm.com miscRegs[MISCREG_SPSR_ABT] = val; 2579087Sandreas.hansson@arm.com return; 2589087Sandreas.hansson@arm.com case MODE_UNDEFINED: 2599087Sandreas.hansson@arm.com miscRegs[MISCREG_SPSR_UND] = val; 2609087Sandreas.hansson@arm.com return; 2619087Sandreas.hansson@arm.com default: 2629087Sandreas.hansson@arm.com miscRegs[MISCREG_SPSR] = val; 2639087Sandreas.hansson@arm.com return; 2648975Sandreas.hansson@arm.com } 2658975Sandreas.hansson@arm.com } 2668975Sandreas.hansson@arm.com miscRegs[misc_reg] = val; 2678975Sandreas.hansson@arm.com} 2688975Sandreas.hansson@arm.com 2698975Sandreas.hansson@arm.comvoid 2708975Sandreas.hansson@arm.comISA::setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc) 2712381SN/A{ 2722381SN/A MiscReg newVal = val; 2738922Swilliam.wang@arm.com if (misc_reg == MISCREG_CPSR) { 2748922Swilliam.wang@arm.com updateRegMap(val); 2758922Swilliam.wang@arm.com CPSR cpsr = val; 2768922Swilliam.wang@arm.com DPRINTF(Arm, "Updating CPSR to %#x f:%d i:%d a:%d mode:%#x\n", 2778922Swilliam.wang@arm.com cpsr, cpsr.f, cpsr.i, cpsr.a, cpsr.mode); 2788922Swilliam.wang@arm.com Addr npc = tc->readNextPC() & ~PcModeMask; 2798922Swilliam.wang@arm.com if (cpsr.j) 2808922Swilliam.wang@arm.com npc = npc | (ULL(1) << PcJBitShift); 2818922Swilliam.wang@arm.com if (cpsr.t) 2828975Sandreas.hansson@arm.com npc = npc | (ULL(1) << PcTBitShift); 2838975Sandreas.hansson@arm.com 2848922Swilliam.wang@arm.com tc->setNextPC(npc); 2858922Swilliam.wang@arm.com } else if (misc_reg >= MISCREG_CP15_UNIMP_START && 2868922Swilliam.wang@arm.com misc_reg < MISCREG_CP15_END) { 2878922Swilliam.wang@arm.com panic("Unimplemented CP15 register %s wrote with %#x.\n", 2888922Swilliam.wang@arm.com miscRegName[misc_reg], val); 2898922Swilliam.wang@arm.com } else { 2908965Sandreas.hansson@arm.com switch (misc_reg) { 2919031Sandreas.hansson@arm.com case MISCREG_ITSTATE: 2928922Swilliam.wang@arm.com { 2938922Swilliam.wang@arm.com ITSTATE itstate = newVal; 2948922Swilliam.wang@arm.com CPSR cpsr = miscRegs[MISCREG_CPSR]; 2958922Swilliam.wang@arm.com cpsr.it1 = itstate.bottom2; 2968922Swilliam.wang@arm.com cpsr.it2 = itstate.top6; 2978922Swilliam.wang@arm.com miscRegs[MISCREG_CPSR] = cpsr; 2988922Swilliam.wang@arm.com DPRINTF(MiscRegs, 2998948Sandreas.hansson@arm.com "Updating ITSTATE -> %#x in CPSR -> %#x.\n", 3008948Sandreas.hansson@arm.com (uint8_t)itstate, (uint32_t)cpsr); 3018948Sandreas.hansson@arm.com } 3028948Sandreas.hansson@arm.com break; 3038948Sandreas.hansson@arm.com case MISCREG_CPACR: 3048948Sandreas.hansson@arm.com { 3058948Sandreas.hansson@arm.com CPACR newCpacr = 0; 3068948Sandreas.hansson@arm.com CPACR valCpacr = val; 3078948Sandreas.hansson@arm.com newCpacr.cp10 = valCpacr.cp10; 3088948Sandreas.hansson@arm.com newCpacr.cp11 = valCpacr.cp11; 3098948Sandreas.hansson@arm.com if (newCpacr.cp10 != 0x3 || newCpacr.cp11 != 3) { 3108948Sandreas.hansson@arm.com panic("Disabling coprocessors isn't implemented.\n"); 3118948Sandreas.hansson@arm.com } 3128948Sandreas.hansson@arm.com newVal = newCpacr; 3138948Sandreas.hansson@arm.com } 3148948Sandreas.hansson@arm.com break; 3158948Sandreas.hansson@arm.com case MISCREG_CSSELR: 3168948Sandreas.hansson@arm.com warn("The csselr register isn't implemented.\n"); 3178948Sandreas.hansson@arm.com break; 3188948Sandreas.hansson@arm.com case MISCREG_FPSCR: 3198975Sandreas.hansson@arm.com { 3208975Sandreas.hansson@arm.com const uint32_t ones = (uint32_t)(-1); 3218975Sandreas.hansson@arm.com FPSCR fpscrMask = 0; 3228975Sandreas.hansson@arm.com fpscrMask.ioc = ones; 3238975Sandreas.hansson@arm.com fpscrMask.dzc = ones; 3248975Sandreas.hansson@arm.com fpscrMask.ofc = ones; 3258975Sandreas.hansson@arm.com fpscrMask.ufc = ones; 3268975Sandreas.hansson@arm.com fpscrMask.ixc = ones; 3278975Sandreas.hansson@arm.com fpscrMask.idc = ones; 3288975Sandreas.hansson@arm.com fpscrMask.len = ones; 3298975Sandreas.hansson@arm.com fpscrMask.stride = ones; 3308948Sandreas.hansson@arm.com fpscrMask.rMode = ones; 3318948Sandreas.hansson@arm.com fpscrMask.fz = ones; 3328975Sandreas.hansson@arm.com fpscrMask.dn = ones; 3338975Sandreas.hansson@arm.com fpscrMask.ahp = ones; 3348975Sandreas.hansson@arm.com fpscrMask.qc = ones; 3358975Sandreas.hansson@arm.com fpscrMask.v = ones; 3368975Sandreas.hansson@arm.com fpscrMask.c = ones; 3378948Sandreas.hansson@arm.com fpscrMask.z = ones; 3388975Sandreas.hansson@arm.com fpscrMask.n = ones; 3398948Sandreas.hansson@arm.com newVal = (newVal & (uint32_t)fpscrMask) | 3408948Sandreas.hansson@arm.com (miscRegs[MISCREG_FPSCR] & ~(uint32_t)fpscrMask); 3419087Sandreas.hansson@arm.com } 3429087Sandreas.hansson@arm.com break; 3439087Sandreas.hansson@arm.com case MISCREG_FPEXC: 3449087Sandreas.hansson@arm.com { 3459087Sandreas.hansson@arm.com const uint32_t fpexcMask = 0x60000000; 3469087Sandreas.hansson@arm.com newVal = (newVal & fpexcMask) | 3479087Sandreas.hansson@arm.com (miscRegs[MISCREG_FPEXC] & ~fpexcMask); 3488922Swilliam.wang@arm.com } 3498922Swilliam.wang@arm.com break; 3508922Swilliam.wang@arm.com case MISCREG_SCTLR: 3518922Swilliam.wang@arm.com { 3528922Swilliam.wang@arm.com DPRINTF(MiscRegs, "Writing SCTLR: %#x\n", newVal); 3538922Swilliam.wang@arm.com SCTLR sctlr = miscRegs[MISCREG_SCTLR]; 3548922Swilliam.wang@arm.com SCTLR new_sctlr = newVal; 3558922Swilliam.wang@arm.com new_sctlr.nmfi = (bool)sctlr.nmfi; 3568922Swilliam.wang@arm.com miscRegs[MISCREG_SCTLR] = (MiscReg)new_sctlr; 3578922Swilliam.wang@arm.com return; 3588922Swilliam.wang@arm.com } 3598922Swilliam.wang@arm.com case MISCREG_TLBTR: 3608922Swilliam.wang@arm.com case MISCREG_MVFR0: 3618922Swilliam.wang@arm.com case MISCREG_MVFR1: 3628922Swilliam.wang@arm.com case MISCREG_MPIDR: 3638922Swilliam.wang@arm.com case MISCREG_FPSID: 3648922Swilliam.wang@arm.com return; 3658922Swilliam.wang@arm.com case MISCREG_TLBIALLIS: 3668922Swilliam.wang@arm.com case MISCREG_TLBIALL: 3678922Swilliam.wang@arm.com warn("Need to flush all TLBs in MP\n"); 3688922Swilliam.wang@arm.com tc->getITBPtr()->flushAll(); 3698922Swilliam.wang@arm.com tc->getDTBPtr()->flushAll(); 3708922Swilliam.wang@arm.com return; 3718975Sandreas.hansson@arm.com case MISCREG_ITLBIALL: 3728975Sandreas.hansson@arm.com tc->getITBPtr()->flushAll(); 3738975Sandreas.hansson@arm.com return; 3748975Sandreas.hansson@arm.com case MISCREG_DTLBIALL: 3758975Sandreas.hansson@arm.com tc->getDTBPtr()->flushAll(); 3768975Sandreas.hansson@arm.com return; 3778975Sandreas.hansson@arm.com case MISCREG_TLBIMVAIS: 3788975Sandreas.hansson@arm.com case MISCREG_TLBIMVA: 3798975Sandreas.hansson@arm.com warn("Need to flush all TLBs in MP\n"); 3808975Sandreas.hansson@arm.com tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12), 3818975Sandreas.hansson@arm.com bits(newVal, 7,0)); 3828975Sandreas.hansson@arm.com tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12), 3838975Sandreas.hansson@arm.com bits(newVal, 7,0)); 3848975Sandreas.hansson@arm.com return; 3858975Sandreas.hansson@arm.com case MISCREG_TLBIASIDIS: 3868975Sandreas.hansson@arm.com case MISCREG_TLBIASID: 3878975Sandreas.hansson@arm.com warn("Need to flush all TLBs in MP\n"); 3888975Sandreas.hansson@arm.com tc->getITBPtr()->flushAsid(bits(newVal, 7,0)); 3898975Sandreas.hansson@arm.com tc->getDTBPtr()->flushAsid(bits(newVal, 7,0)); 3908975Sandreas.hansson@arm.com return; 3918975Sandreas.hansson@arm.com case MISCREG_TLBIMVAAIS: 3928975Sandreas.hansson@arm.com case MISCREG_TLBIMVAA: 3938975Sandreas.hansson@arm.com warn("Need to flush all TLBs in MP\n"); 3948975Sandreas.hansson@arm.com tc->getITBPtr()->flushMva(mbits(newVal, 31,12)); 3958975Sandreas.hansson@arm.com tc->getDTBPtr()->flushMva(mbits(newVal, 31,12)); 3968975Sandreas.hansson@arm.com return; 3979087Sandreas.hansson@arm.com case MISCREG_ITLBIMVA: 3989087Sandreas.hansson@arm.com tc->getITBPtr()->flushMvaAsid(mbits(newVal, 31, 12), 3999087Sandreas.hansson@arm.com bits(newVal, 7,0)); 4009087Sandreas.hansson@arm.com return; 4019087Sandreas.hansson@arm.com case MISCREG_DTLBIMVA: 4029087Sandreas.hansson@arm.com tc->getDTBPtr()->flushMvaAsid(mbits(newVal, 31, 12), 4039087Sandreas.hansson@arm.com bits(newVal, 7,0)); 4048922Swilliam.wang@arm.com return; 4058922Swilliam.wang@arm.com case MISCREG_ITLBIASID: 4062381SN/A tc->getITBPtr()->flushAsid(bits(newVal, 7,0)); 407 return; 408 case MISCREG_DTLBIASID: 409 tc->getDTBPtr()->flushAsid(bits(newVal, 7,0)); 410 return; 411 case MISCREG_ACTLR: 412 warn("Not doing anything for write of miscreg ACTLR\n"); 413 break; 414 case MISCREG_PMCR: 415 case MISCREG_PMCCNTR: 416 case MISCREG_PMSELR: 417 warn("Not doing anything for write to miscreg %s\n", 418 miscRegName[misc_reg]); 419 break; 420 case MISCREG_V2PCWPR: 421 case MISCREG_V2PCWPW: 422 case MISCREG_V2PCWUR: 423 case MISCREG_V2PCWUW: 424 case MISCREG_V2POWPR: 425 case MISCREG_V2POWPW: 426 case MISCREG_V2POWUR: 427 case MISCREG_V2POWUW: 428 { 429 RequestPtr req = new Request; 430 unsigned flags; 431 BaseTLB::Mode mode; 432 Fault fault; 433 switch(misc_reg) { 434 case MISCREG_V2PCWPR: 435 flags = TLB::MustBeOne; 436 mode = BaseTLB::Read; 437 break; 438 case MISCREG_V2PCWPW: 439 flags = TLB::MustBeOne; 440 mode = BaseTLB::Write; 441 break; 442 case MISCREG_V2PCWUR: 443 flags = TLB::MustBeOne | TLB::UserMode; 444 mode = BaseTLB::Read; 445 break; 446 case MISCREG_V2PCWUW: 447 flags = TLB::MustBeOne | TLB::UserMode; 448 mode = BaseTLB::Write; 449 break; 450 default: 451 panic("Security Extensions not implemented!"); 452 } 453 req->setVirt(0, val, 1, flags, tc->readPC()); 454 fault = tc->getDTBPtr()->translateAtomic(req, tc, mode); 455 if (fault == NoFault) { 456 miscRegs[MISCREG_PAR] = 457 (req->getPaddr() & 0xfffff000) | 458 (tc->getDTBPtr()->getAttr() ); 459 DPRINTF(MiscRegs, 460 "MISCREG: Translated addr 0x%08x: PAR: 0x%08x\n", 461 val, miscRegs[MISCREG_PAR]); 462 } 463 else { 464 // Set fault bit and FSR 465 FSR fsr = miscRegs[MISCREG_DFSR]; 466 miscRegs[MISCREG_PAR] = 467 (fsr.ext << 6) | 468 (fsr.fsHigh << 5) | 469 (fsr.fsLow << 1) | 470 0x1; // F bit 471 } 472 return; 473 } 474 } 475 } 476 setMiscRegNoEffect(misc_reg, newVal); 477} 478 479} 480